पीडीएफ => रेखापुंज, क्या इनपुट पृष्ठ आकार के नमूने के संकल्प को अनुकूलित करना संभव है?


5

मैं convert(Imagemagick घटक का उपयोग कर रहा हूँ , पृष्ठभूमि में घोस्टस्क्रिप्ट के लिए प्रतिनिधि) छवियों के लिए पीडीएफ फाइलों के पहले पृष्ठ को बदलने के लिए।

आमतौर पर, convert -density 200 file.pdf[0] first_page.pngयह काम करेगा, और यह पीडीएफ फाइल को 200 पिक्सेल प्रति इंच के कागज पर नमूना करेगा।

हालांकि यह शायद ही कभी होता है कि कुछ PDF असामान्य रूप से विशाल होते हैं (कभी-कभी A0 पेपर, और हाल ही में एक पीडीएफ जिसमें 23 m inch (लंबाई में 183 इंच, चौड़ाई में 185)।

ऐसी फ़ाइलों के लिए, convertलटका होगा, सीपीयू समय खाएं। चौड़ाई और ऊंचाई में 35000+ पिक्सेल की छवियां केवल उपयोग करने योग्य नहीं हैं।

इसलिए सवाल: Imagemagick में एक स्विच है जो पृष्ठ आकार में घनत्व को अनुकूलित करेगा, या कम से कम यह निर्दिष्ट करेगा कि हम पीडीएफ फाइल (अधिकतम बाएं कोने, 30x30 इंच के अधिकतम क्षेत्र के एक हिस्से से अधिक का नमूना नहीं लेना चाहते हैं) उदाहरण के लिए)?

धन्यवाद।

EDIT : अपने आधिकारिक git रिपॉजिटरी पर, MuPDF ने जोड़ा है -wऔर -hस्विच करता है, जो संयुक्त रूप से -rवही करेगा जो यहां चाहता है।

जवाबों:


1

मैंने सबसे अच्छे फिट मोड में ड्राइंग का समर्थन करने के लिए mupdf के pdf को संशोधित किया है, इसलिए मैं यह बता सकता हूं कि आउटपुट को अधिकतम 128x128 होना चाहिए और यह पहलू अनुपात को बनाए रखते हुए बॉक्स में आउटपुट को फिट करेगा। इससे पहले कि मैंने यह किया कि पृष्ठ आकार प्राप्त करने के लिए pdfinfo का उपयोग करने का एकमात्र तरीका था और फिर इसे एक बॉक्स में फिट करने के लिए कैलक्चुएशन करना और फिर पीडीएफ स्केल को उस स्केल फैक्टर (डॉट्स प्रति इंच) के साथ खींचने के लिए कहना।

खैर, उस लंबी कहानी के बाद ऐसा करने की प्रक्रिया सरल है:

  1. रेंडर करने के लिए पृष्ठ का पृष्ठ आकार प्राप्त करें (पीडीएफ़ मीडिया बॉक्स में) यह पीडीएफ़एनएफओ और जीआरईपी के माध्यम से किया जा सकता है और पीटीएस (अंक, 1/72 वाँ एक इंच) या पीडीएफ़ लाइब्रेरी जैसे पीडीएफ़पी के माध्यम से दिखाई देगा जैसे:

    import pyPdf
    p = pyPdf.PdfFileReader(file("/home/dan/Desktop/Sieve-JFP.pdf", "rb"))
    x,y,w,h = p.pages[0]['/MediaBox']
    
  2. एक बॉक्स फिट के लिए dpi = min( A/(w/72.), B/(h/72.) )
    जहां Aअधिकतम चौड़ाई है और Bअधिकतम ऊंचाई है; wऔर hपृष्ठ की चौड़ाई और ऊंचाई हैं।

  3. पास dpiकरनाconvert -density $dpi

और के रूप में अनुरोध एक छोटे से ठग git प्रतिबद्ध अंतर:

commit 0000000000000000000000000000000000000000
Author: Dan D.
Date:   Thu Jul 28 16:33:33 2011 -0400

    add options to pdfdraw to limit the output's width and height

    note that scaling must occur before rotation

diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c
index 0000000..1234567 100644
--- a/apps/pdfdraw.c
+++ b/apps/pdfdraw.c
@@ -12,8 +12,10 @@
 #endif

 char *output = NULL;
-float resolution = 72;
+float resolution = -1;
 float rotation = 0;
+float width = -1;
+float height = -1;

 int showxml = 0;
 int showtext = 0;
@@ -47,6 +49,8 @@ static void usage(void)
        "\t\tsupported formats: pgm, ppm, pam, png, pbm\n"
        "\t-p -\tpassword\n"
        "\t-r -\tresolution in dpi (default: 72)\n"
+       "\t-w -\tmaximum width (default: no limit)\n"
+       "\t-h -\tmaximum height (default: no limit)\n"
        "\t-A\tdisable accelerated functions\n"
        "\t-a\tsave alpha channel (only pam and png)\n"
        "\t-b -\tnumber of bits of antialiasing (0 to 8)\n"
@@ -150,13 +154,39 @@ static void drawpage(pdf_xref *xref, int pagenum)

    if (output || showmd5 || showtime)
    {
-       float zoom;
+       float zoom = 1.0;
        fz_matrix ctm;
        fz_bbox bbox;
        fz_pixmap *pix;
+       float W, H;

-       zoom = resolution / 72;
-       ctm = fz_translate(0, -page->mediabox.y1);
+       ctm = fz_identity;
+       ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.y1));
+       ctm = fz_concat(ctm, fz_rotate(page->rotate));
+       ctm = fz_concat(ctm, fz_rotate(rotation));
+       bbox = fz_round_rect(fz_transform_rect(ctm, page->mediabox));
+
+       W = bbox.x1 - bbox.x0; 
+       H = bbox.y1 - bbox.y0;
+       if (resolution != -1)
+           zoom = resolution / 72;
+       if (width != -1) 
+       {
+           if (resolution != -1)
+               zoom = MIN(zoom, width/W);
+           else
+               zoom = width/W;
+       }
+       if (height != -1)
+       {
+           if (resolution != -1 || width != -1)
+               zoom = MIN(zoom, height/H);
+           else
+               zoom = height/H;
+       }
+
+       ctm = fz_identity;
+       ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.y1));
        ctm = fz_concat(ctm, fz_scale(zoom, -zoom));
        ctm = fz_concat(ctm, fz_rotate(page->rotate));
        ctm = fz_concat(ctm, fz_rotate(rotation));
@@ -295,7 +325,7 @@ int main(int argc, char **argv)
    fz_error error;
    int c;

-   while ((c = fz_getopt(argc, argv, "o:p:r:R:Aab:dgmtx5")) != -1)
+   while ((c = fz_getopt(argc, argv, "o:p:r:R:w:h:Aab:dgmtx5")) != -1)
    {
        switch (c)
        {
@@ -303,6 +333,8 @@ int main(int argc, char **argv)
        case 'p': password = fz_optarg; break;
        case 'r': resolution = atof(fz_optarg); break;
        case 'R': rotation = atof(fz_optarg); break;
+       case 'w': width = atof(fz_optarg); break;
+       case 'h': height = atof(fz_optarg); break;
        case 'A': accelerate = 0; break;
        case 'a': savealpha = 1; break;
        case 'b': alphabits = atoi(fz_optarg); break;
@@ -321,6 +353,10 @@ int main(int argc, char **argv)
    if (fz_optind == argc)
        usage();

+   if (width+height == -2)
+       if (resolution == -1)
+           resolution = 72;
+
    if (!showtext && !showxml && !showtime && !showmd5 && !output)
    {
        printf("nothing to do\n");

धन्यवाद! जब आप कहते हैं कि आपने pdf निकासी को संशोधित किया है ... तो मैं आपका संशोधन कहां से कर सकता हूं?
बेनोइट

आपका स्वागत है, ठीक है, ध्यान दें कि वे mupdf के pdfड्राइव पर लागू होते हैं और xpdf के pdfड्राइव के लिए नहीं, जो कि कमांड है जिसे आमतौर पर pdfdraw के रूप में संदर्भित किया जाता है। वे मेरे ~/git.l/mupdfgit repos में रहते हैं जो ऑनलाइन नहीं है। मुख्य रूप से क्योंकि मेरे परिवर्तन mupdf के पुराने संस्करण पर लागू होते हैं (मुझे लगता है कि 0.8 है; मैं 0.9 के लिए अद्यतन करने जा रहा था, लेकिन mupdf रिपोट में कमेंट इतने गन्दे हैं और हालांकि कमिटर्स को पता है कि कोड को कैसे लिखा जाता है, यह लिखने के लिए वे नहीं जानते। करता है) और मैं उलझन में हूं कि मैं क्या करने की कोशिश कर रहा हूं।
डैन डी।

वहाँ एक तरह से आप एक पोस्ट कहीं भी तो है? धन्यवाद!
बेनोइट

बहुत बढिया आपको धन्यवाद। इसे अनुकूलित करने की कोशिश करेंगे! मैं उस उत्तर के लिए एक इनाम जोड़ने पर विचार कर रहा हूं जब मैं इसे खोलने में सक्षम हूं। अगर मैं भूल जाता हूं तो कृपया मुझे याद दिलाएं।
बेनोइट

प्रस्तुत पैच प्रस्ताव 692855 घोस्टस्क्रिप्ट के लिए। एक बार फिर धन्यवाद।
बेनोइट

0

आप गलत कमांड का उपयोग कर रहे हैं। -resampleइसके बजाय उपयोग करें । यदि संभव हो तो एक विशिष्ट चौड़ाई और ऊंचाई प्रदान करना भी उचित है।

-densityकेवल एक झंडा है। -resampleवास्तव में पिक्सेल आयामों को बदलता है: एकमात्र माप जो मायने रखता है।

संपादित करें: http://www.imagemagick.org/script/command-line-options.php#resample के लिए डॉक्टर-resample

-Density विकल्प एक विशेषता सेट करता है और अंतर्निहित रेखापुंज छवि को परिवर्तित नहीं करता है। इसका उपयोग डेस्कटॉप प्रकाशन उद्देश्यों के लिए प्रदान किए गए आकार को पिक्सल पर लागू पैमाने को समायोजित करने के लिए किया जा सकता है। छवि को आकार देने के लिए ताकि यह एक अलग रिज़ॉल्यूशन पर समान आकार का हो, -resample विकल्प का उपयोग करें।

सीजी में एक सरलीकृत स्तर पर, इंच मौजूद नहीं है। रेखापुंज छवियों के लिए, केवल पिक्सेल संग्रहीत हैं। डीपीआई केवल एक सुझाव है।

मान लें कि आपके पास एक मेज पर 3 वर्ग हैं, और 300 पैसे हैं। अगर मेरे पास प्रति वर्ग में 300 पैसे का घनत्व है, तो इसमें केवल एक वर्ग है जिसमें 300 पैसे हैं।

अगर मैं density100 pps में बदल जाऊं, तो मेरे पास अब 3 वर्ग हैं, लेकिन अभी भी कुल 300 पैसे (प्रत्येक वर्ग में 100 पैसे) हैं। आपने पैसों की संख्या में बदलाव नहीं किया है, केवल जिस तरीके से आप पेनीज़ को माप की मनमानी इकाई में वितरित करते हैं।

अगर मैं resample100pps के मूल में 1 वर्ग, और कुल 100 पैसे हैं। मैंने पेनी की संख्या बदल दी है।

मुझे संदेह है कि उन मामलों में जहां पृष्ठ का आकार ऊपर जाता है, आप एक ऐसी चीज़ के साथ काम कर रहे हैं जिसमें 1200dpi लाइन कला जैसे उच्च रिज़ॉल्यूशन था, और densityजब आप ध्वज को सम्मानित करने वाले किसी चीज़ के साथ परिणाम को खोलते हैं तो इंच माप को 300 चौगुनी में बदल देते हैं ।


मुझे खेद है, मैं उस उत्तर को नहीं समझता; क्या आप अधिक सटीक हो सकते हैं और कमांड लाइन दे सकते हैं? मुझे याद है कि मुझे पहले से पृष्ठ आयाम नहीं पता है, और मैं कागज के लगभग 200px प्रति इंच के रेखापुंज करना चाहता हूं, जब तक कि आउटपुट रेखापुंज बहुत बड़ा नहीं होगा, तब डाउनस्केल। कृपया उस के लिए आप किस कमांड का उपयोग करेंगे? धन्यवाद।
बेनोइट

convertप्रलेखन के लिंक के लिए संपादित देखें
क्षितिज

ठीक है, लेकिन यह मेरी समस्या से कैसे संबंधित है? जब आप इसे Imagemagick के साथ पढ़ते हैं, तो PDF प्रारूप में पिक्सेल की कोई धारणा नहीं होती है। जब आप इसे लोड करते हैं, तो -densityइसका उपयोग करने के लिए पैरामीटर का उपयोग किया जाता है।
बेनोइट

पीडीएफ एक कंटेनर प्रारूप है जिसमें चित्र शामिल हो सकते हैं और इसमें निर्दिष्ट पेपर आकार पर एक दस्तावेज़ प्रदान करने के प्रयोजनों के लिए डीपीआई जानकारी भी शामिल है। के लिए प्रलेखन convertक्या आज्ञाओं और मापदंडों का उपयोग करने के लिए बताते हैं। और जैसा कि मैंने कहा था: यदि आप वांछित चौड़ाई और ऊंचाई (उर्फ आकार) निर्दिष्ट करते हैं -resample, तो, आप स्पष्ट रूप से बताएं convertकि आप क्या चाहते हैं। -resampleकमांड का उपयोग "छवि का आकार बदलने के लिए किया जाता है ताकि इसका गाया आकार निर्दिष्ट लक्ष्य रिज़ॉल्यूशन में मूल के समान रहे।" जब भी इंच को एक आयाम के रूप में उपयोग किया जाता है, तो यह रेंडर
17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.