2011-08-18 14 views
6

हमारे पास एक .NET ऐप है जो वर्तमान में पीडीएफशर्प का उपयोग कर वास्तविक प्रिंटर और पीडीएफ दोनों को प्रिंट करता है, हालांकि बेहतर विकल्प होने पर उस भाग को बदला जा सकता है। अधिकांश आउटपुट टेक्स्ट या इमेज जेनरेट किए जाते हैं, लेकिन एक या अधिक पेज हो सकते हैं जो अंत में जुड़ जाते हैं। वह पृष्ठ अंतिम उपयोगकर्ता द्वारा पीडीएफ प्रारूप में प्रदान किया जाता है।क्या पीडीएफ को वेक्टर छवि प्रारूप में परिवर्तित किया जा सकता है जिसे .NET से मुद्रित किया जा सकता है?

कागज पर प्रिंट करते समय, हमारे उपयोगकर्ता प्री-प्रिंटेड पेपर का उपयोग करते हैं, लेकिन निर्यात किए गए पीडीएफ के मामले में, हम उन पृष्ठों को अंत में जोड़ते हैं, क्योंकि वे पहले ही पीडीएफ प्रारूप में हैं।

हम उन पीडीएफ़ प्रिंट धारा में सीधे एम्बेड करने के लिए तो वे पहले से प्रिंट कागज की जरूरत नहीं है सक्षम होना चाहते हैं। हालांकि, एक जीडीआई पेज (System.Drawing.Graphics) में पीडीएफ प्रस्तुत करने के लिए वास्तव में कोई अच्छा विकल्प नहीं है।

वहाँ एक सदिश प्रारूप पीडीएफ कुछ बाहरी प्रोग्राम के द्वारा करने के लिए परिवर्तित किया जा सकता है, कि एक बिटमैप पहले करने के लिए रूपांतरण से अपमानित किया जा रहा बिना एक GDI + पेज को प्रदान की गई सकता है?

+0

हम कुछ ऐसा करते हैं लेकिन पीडीएफ को पहले बिटमैप में प्रस्तुत करते हैं - गुणवत्ता की समस्या को उच्च गुणवत्ता वाली लाइब्रेरी और उच्च डीपीआई मान (न्यूनतम 305, सर्वोत्तम 1200) का उपयोग करते हुए प्रतिपादन करते समय प्राप्त किया जा सकता है, जिसमें कुछ मेमोरी/प्रदर्शन होता है ... – Yahia

+1

मैंने दूसरे दिन देखा कि पीडीएफ क्रिएटर (http://sourceforge.net/projects/pdfcreator/), मुख्य रूप से पीडीएफ निर्माण के उद्देश्य से होने के बावजूद, वास्तव में प्रारूपों की एक विस्तृत श्रृंखला में पीडीएफ दस्तावेजों को मुद्रित करने के लिए उपयोग किया जा सकता है, एसवीजी और बिटमैप छवियां। देखने लायक हो सकता है। –

+0

ये पीडीएफ कुछ लाइन कला के साथ पाठ होते हैं। वे एक रन में 1000+ बार मुद्रित भी होंगे। एक 5 एमबी बिटमैप में 30 केबी पीडीएफ को कनवर्ट करने से शायद पूरे प्रिंट कतार को घुटनों पर लाया जाएगा। –

उत्तर

2

के लिए "How To Convert PDF to EMF In .NET," शीर्षक से एक लेख में मैं कैसे हमारे PDFOne नेट उत्पाद का उपयोग यह करने के लिए दिखाया गया है। ईएमएफ वेक्टर ग्राफिक्स हैं और आप उन्हें प्रिंटर कैनवास पर प्रस्तुत कर सकते हैं।

आप के लिए एक आसान विकल्प है पीडीएफ ओवरले शीर्षक से एक अन्य लेख में विस्तार से बताया "PDF Overlay - Stitching PDF Pages Together in .NET।" पीडीएफओएन एक्स-वाई ऑफसेट को ओवरले में अनुमति देता है जो आपको किनारों पर पृष्ठों को सिलाई करने की अनुमति देता है। यहां उद्धृत आलेख में, मैंने ऑफसेट को शून्य पर सेट करके पृष्ठों को एक-दूसरे पर ओवरलैड किया है। आप इसे पेज चौड़ाई और ऊंचाई पर सेट कर देंगे।

अस्वीकरण: मैं नोस्टिस के लिए काम करता हूं।

+0

हम वास्तव में पहले से ही दो पीडीएफ को सिलाई करने के लिए डेल्फी में नोस्टिस पीडीएफ टूलकिट का उपयोग करते हैं, लेकिन हम प्रिंटिंग को .NET पर ले जा रहे हैं। इसलिए और विकल्प उपलब्ध हैं। मुझे डेल्फी घटक पर GetPageMetafile() नहीं दिखाई देता है, क्या यह एक नया जोड़ा है, या .NET संस्करण के लिए विशिष्ट है? –

+0

दूसरा सवाल, क्या यह वास्तव में स्टैंडअलोन .EMF फ़ाइलों को उत्पन्न करता है? हमने वास्तव में अतीत में एक उत्पाद का उपयोग करने की कोशिश की थी जिसे आपको .EMF पर प्रिंट करने देना था, लेकिन आउटपुट फ़ाइल केवल तब तक काम करती थी जब तक कि प्रिंटिंग प्रोग्राम खुला नहीं था, क्योंकि उस प्रोग्राम को बंद करते समय गायब होने वाले मूल प्रोग्राम में कॉलबैक था । यदि PDFOne.NET काम कर रहे .EMF फ़ाइलों की गारंटी दे सकता है, जो मुझे लगता है कि समाधान की तरह लगता है। –

+0

पीडीएफटोल्किट में दो विधियां हैं - रेंडर टीओडीसी (जिसमें आप प्रिंटर कैनवास पास कर सकते हैं) और रेंडरटॉस्ट्रीम (जिसमें आप एक ईएमएफ स्ट्रीम की आपूर्ति करते हैं)। ये विधियां पीडीएफओनेट के समान ईएमएफ उत्पन्न करती हैं .NET के GetPageMetafile। PDFOne .NET में, GetPageMetaFile केवल ProPlus संस्करण में उपलब्ध है। – BZ1

0

Ghostscript कर सकते हैं उत्पादन पोस्टस्क्रिप्ट (जो एक सदिश फ़ाइल है) जो सीधे प्रिंटर के कुछ प्रकार के लिए भेजा जा सकता है। उदाहरण के लिए, यदि आप एलपीआर सक्षम प्रिंटर का उपयोग कर रहे हैं, तो पीएस फ़ाइल सीधे इस प्रिंटर की तरह कुछ प्रिंटर पर सेट की जा सकती है: http://www.codeproject.com/KB/printing/lpr.aspx

कुछ वाणिज्यिक विकल्प भी हैं जो एक पीडीएफ प्रिंट कर सकते हैं (हालांकि मैं हूं यकीन नहीं करता है, तो आंतरिक तंत्र, वेक्टर या बिटमैप आधारित) है, उदाहरण के http://www.tallcomponents.com/pdfcontrols2-features.aspx या http://www.tallcomponents.com/pdfrasterizer3.aspx

+0

मेरे पास उपयोग किए जाने वाले प्रिंटर पर कोई प्रत्यक्ष नियंत्रण नहीं है, मेरा अनुमान पीसीएल के रूप में सबसे अधिक सेटअप है, पोस्टस्क्रिप्ट नहीं। दूसरी समस्या यह है कि वे पृष्ठों में से किसी एक के पीछे पीडीएफ चाहते हैं (इस प्रकार प्री-प्रिंटेड पेपर), इसलिए इसे एक अलग प्रिंट जॉब के रूप में नहीं भेजा जा सकता है। –

+0

खैर, GhostPCL (http://ghostscript.com/GhostPCL.html) भी मौजूद है :) – userx

-1

जबकि ओपन सोर्स नहीं है और .NET मूल नहीं है (डेल्फी आधारित मुझे विश्वास है, लेकिन एक प्रीकंपिल्ड .NET लाइब्रेरी प्रदान करता है), Quick PDF एक ईएमएफ फ़ाइल में एक पीडीएफ प्रस्तुत कर सकता है जिसे आप अपने ग्राफिक्स ऑब्जेक्ट में लोड कर सकते हैं।

0

मुझे अंत में पता चला कि एक ऐसा विकल्प है जो एक प्रिंट नौकरी में वेक्टर प्रारूप को एम्बेड करने की मेरी सामान्य आवश्यकता को संबोधित करता है, लेकिन यह जीडीआई आधारित प्रिंटिंग के साथ काम नहीं करता है। Microsoft XPS लेखक प्रिंट ड्राइवर द्वारा बनाई

एक्सपीएस फ़ाइल स्वरूप WPF से मुद्रित किया जा सकता, का उपयोग कर ReachFramework.dll .NET में शामिल थे। जीडीआई के बजाय प्रिंटिंग के लिए डब्ल्यूपीएफ का उपयोग करके, एक एक्सपीएस दस्तावेज़ पृष्ठ को एक बड़े प्रिंट दस्तावेज़ में एम्बेड करना संभव है।

नकारात्मक पक्ष WPF मुद्रण काफ़ी अलग काम करता है, है, तो सभी का समर्थन कोड कि सीधे Sytem.Drawing नाम स्थान में सामान का उपयोग करता है फिर से लिखा जाना चाहिए।

दस्तावेज़ खोलें:

XpsDocument xpsDoc = new XpsDocument(filename, System.IO.FileAccess.Read); 
var document = xpsDoc.GetFixedDocumentSequence().DocumentPaginator; 

// pass the document into a custom DocumentPaginator that will decide 
// what order to print the pages: 
var mypaginator = new myDocumentPaginator(new DocumentPaginator[] { document }); 

// pass the paginator into PrintDialog.PrintDocument() to do the actual printing: 
new PrintDialog().PrintDocument(mypaginator, "printjobname"); 

फिर DocumentPaginator का वंशज बनाते हैं तो वह अपने वास्तविक मुद्रण करना होगा

यहाँ कैसे एक्सपीएस दस्तावेज़ एम्बेड करने की बुनियादी रूपरेखा है।अमूर्त तरीकों को ओवरराइड करें, विशेष रूप से GetPage को सही क्रम में दस्तावेज़पृष्ठ वापस करना चाहिए। यहाँ अवधारणा कोड के अपने सबूत यह दर्शाता है कि एक्सपीएस दस्तावेजों की एक सूची के लिए कस्टम सामग्री संलग्न करने का तरीका बताया गया है:

public override DocumentPage GetPage(int pageNumber) 
{ 
    for (int i = 0; i < children.Count; i++) 
    { 
     if (pageNumber >= pageCounts[i]) 
      pageNumber -= pageCounts[i]; 
     else 
      return FixFixedPage(children[i].GetPage(pageNumber)); 
    } 
    if (pageNumber < PageCount) 
    { 
     DrawingVisual dv = new DrawingVisual(); 
     var dc = dv.Drawing.Append(); 
     dc = dv.RenderOpen(); 
     DoRender(pageNumber, dc); // some method to render stuff to the DrawingContext 
     dc.Close(); 
     return new DocumentPage(dv); 
    } 
    return null; 
} 

जब एक और XPS दस्तावेज़ में मुद्रित करने के लिए कोशिश कर रहा है, यह एक अपवाद "FixedPage एक और FixedPage नहीं हो सकते" देता है, और एक H.Alipourian द्वारा पोस्ट दर्शाता है कि यह कैसे तय करने के लिए: http://social.msdn.microsoft.com/Forums/da/wpf/thread/841e804b-9130-4476-8709-0d2854c11582

private DocumentPage FixFixedPage(DocumentPage page) 
{ 
    if (!(page.Visual is FixedPage)) 
     return page; 

    // Create a new ContainerVisual as a new parent for page children 
    var cv = new ContainerVisual(); 
    foreach (var child in ((FixedPage)page.Visual).Children) 
    { 
     // Make a shallow clone of the child using reflection 
     var childClone = (UIElement)child.GetType().GetMethod(
      "MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic 
      ).Invoke(child, null); 

     // Setting the parent of the cloned child to the created ContainerVisual 
     // by using Reflection. 
     // WARNING: If we use Add and Remove methods on the FixedPage.Children, 
     // for some reason it will throw an exception concerning event handlers 
     // after the printing job has finished. 
     var parentField = childClone.GetType().GetField(
      "_parent", BindingFlags.Instance | BindingFlags.NonPublic); 
     if (parentField != null) 
     { 
      parentField.SetValue(childClone, null); 
      cv.Children.Add(childClone); 
     } 
    } 

    return new DocumentPage(cv, page.Size, page.BleedBox, page.ContentBox); 
} 

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