दिलचस्प पोस्ट
मैं बाल खिड़की के डोम ट्री तक कैसे पहुंच सकता हूं? सी में मॉलोक एक 3-आयामी सरणी? खारिज कर दियामॉडल दृश्यकंट्रोलरअनुवादित हटाया गया पता लगाएं कि पेज लोड हो रहा है या नहीं रन टाइम पर जावा कोड जेनरेट, संकलन और उपयोग करना? क्या यह एक गैर-आभासी विधि को ओवरराइड करना संभव है? जावा फ़्लोटिंग पॉइंट उच्च परिशुद्धता पुस्तकालय अतुल्यकालिक बनाम तुल्यकालिक निष्पादन, इसका वास्तव में क्या अर्थ है? मैं कैसे जाँच कर सकता हूं कि जावा स्ट्रिंग्स सभी सफेद स्थान नहीं हैं? रीव्रेटबेज क्या करती है और इसका उपयोग कैसे किया जाता है? मिलान करने वाले फ़ंक्शन पॉइंटर को कॉल करने के लिए एक ट्यूपल को "अनपॅक करना" कस्टम दृश्य के साथ Android CollapsingToolbar लेआउट मैं अपने नेविगेशन पट्टी में एक सूची वस्तु का संपूर्ण क्षेत्र कैसे बना सकता हूं, क्लिक करने योग्य एक लिंक के रूप में? Xcode स्रोत नियंत्रण एकाधिक कार्य प्रतिलिपि दिखा रहा है सी ++ में सेगमेंटेशन दोष क्या पैदा कर सकता है?

एकाधिक पीडीएफ फाइलों को कैसे मर्जित करें (चलाने के समय में उत्पन्न)?

ItextSharp माध्यम से कई पीडीएफ फ़ाइलों को मर्ज करने के लिए (चलाने के समय पर उत्पन्न) तो उन्हें छपाई।

मुझे निम्नलिखित लिंक मिली, लेकिन उस पद्धति के लिए पीडीएफ फाइलों की आवश्यकता है, जो कि पीडीएफ फाइलें संग्रहीत हैं और यह मेरा मामला नहीं है।


मेरे पास कई रिपोर्ट हैं जो मैं उन्हें इस विधि के माध्यम से pdf files कनवर्ट कर दूंगा:

 private void AddReportToResponse(LocalReport followsReport) { string mimeType; string encoding; string extension; string[] streams = new string[100]; Warning[] warnings = new Warning[100]; byte[] pdfStream = followsReport.Render("PDF", "", out mimeType, out encoding, out extension, out streams, out warnings); //Response.Clear(); //Response.ContentType = mimeType; //Response.AddHeader("content-disposition", "attachment; filename=Application." + extension); //Response.BinaryWrite(pdfStream); //Response.End(); } 

अब मैं उन सभी जेनरेट फाइल ( Bytes ) को एक पीडीएफ फाइल में प्रिंट करने के लिए मर्ज करना चाहता हूं

Solutions Collecting From Web of "एकाधिक पीडीएफ फाइलों को कैसे मर्जित करें (चलाने के समय में उत्पन्न)?"

यदि आप iText (तीव्र) का उपयोग करते हुए स्रोत दस्तावेज़ों को मर्ज करना चाहते हैं, तो दो बुनियादी स्थितियां हैं:

  1. आप वास्तव में दस्तावेज़ों को मर्ज करना चाहते हैं, पृष्ठों को अपने मूल स्वरूप में प्राप्त कर सकते हैं, उनकी जितनी सामग्री और उनके इंटरैक्टिव एनोटेशन को यथासंभव बदल सकते हैं। इस मामले में आपको कक्षा के Pdf*Copy* परिवार के सदस्य के आधार पर एक समाधान का उपयोग करना चाहिए।

  2. आप वास्तव में स्रोत दस्तावेज़ों से पृष्ठों को एक नया दस्तावेज़ में एकीकृत करना चाहते हैं, लेकिन चाहते हैं कि नए दस्तावेज़ को सामान्य स्वरूप को नियंत्रित करना चाहिए और मूल दस्तावेजों में इंटरैक्टिव फीचर्स (एनोटेशन …) की परवाह न करें (या यहां तक ​​कि छुटकारा पाने के लिए भी चाहते हैं) उनमें से)। इस मामले में आपको PdfWriter क्लास के आधार पर समाधान का उपयोग करना चाहिए।

आप अध्याय 6 (विशेषकर अनुभाग 6.4) में कार्य-द्वितीय संस्करण में iText के विवरण पा सकते हैं। जावा नमूना कोड यहां तक पहुंचा जा सकता है और सी # 'ified संस्करण यहां पर हैं

PdfCopy का इस्तेमाल करते हुए एक साधारण नमूना PdfCopy है। PdfCopy / PdfCopy । कोड का केंद्रीय टुकड़ा है:

 byte[] mergedPdf = null; using (MemoryStream ms = new MemoryStream()) { using (Document document = new Document()) { using (PdfCopy copy = new PdfCopy(document, ms)) { document.Open(); for (int i = 0; i < pdf.Count; ++i) { PdfReader reader = new PdfReader(pdf[i]); // loop over the pages in that document int n = reader.NumberOfPages; for (int page = 0; page < n; ) { copy.AddPage(copy.GetImportedPage(reader, ++page)); } } } } mergedPdf = ms.ToArray(); } 

यहां pdf को List<byte[]> रूप में परिभाषित किया जा सकता है List<byte[]> तत्काल स्रोत दस्तावेज़ (मध्यवर्ती इन-मेमोरी दस्तावेज़ों को विलीन करने के आपके उपयोग के मामले के लिए उपयुक्त) या List<String> स्रोत दस्तावेज़ फाइलों के नाम वाले (उपयुक्त यदि आप डिस्क से दस्तावेज़ों को मर्ज करते हैं)

संदर्भित अध्याय के अंत में एक सिंहावलोकन वर्णित वर्गों के उपयोग को सारांशित करता है:

  • PdfCopy : एक या अधिक मौजूदा पीडीएफ दस्तावेजों से पृष्ठों की प्रतियां। मेजर डाउनसाइड्स: PdfCopy अनावश्यक सामग्री का पता नहीं लगाती है, और जब PdfCopy करना विफल रहता है

  • PdfCopyFields : विभिन्न रूपों के खेतों को एक रूप में डालता है। PdfCopy का इस्तेमाल करते हुए PdfCopy करते समय फॉर्म फ़ील्ड के साथ आने वाली समस्याओं से बचने के लिए इस्तेमाल किया जा सकता है। मेमोरी उपयोग एक मुद्दा हो सकता है

  • PdfSmartCopy : एक या अधिक मौजूदा पीडीएफ दस्तावेजों से पृष्ठों की प्रतियां। PdfSmartCopy अनावश्यक सामग्री का पता लगाने में सक्षम है, लेकिन इसे PdfCopy तुलना में अधिक मेमोरी और सीपीयू की PdfCopy

  • पीडीएफ PdfWriter : स्क्रैच से पीडीएफ दस्तावेज़ तैयार करता है। अन्य पीडीएफ दस्तावेज़ों से पृष्ठों को आयात कर सकते हैं प्रमुख नकारात्मकता यह है कि इस प्रक्रिया में आयातित पृष्ठ (एनोटेशन, बुकमार्क, फ़ील्ड और अन्य सभी) की सभी इंटरैक्टिव विशेषताएं खो जाती हैं।

मैंने iTextsharp को सी # के साथ पीडीएफ फाइलें संयोजित करने के लिए प्रयोग किया था। यह कोड मैं उपयोग किया है।

 string[] lstFiles=new string[3]; lstFiles[0]=@"C:/pdf/1.pdf"; lstFiles[1]=@"C:/pdf/2.pdf"; lstFiles[2]=@"C:/pdf/3.pdf"; PdfReader reader = null; Document sourceDocument = null; PdfCopy pdfCopyProvider = null; PdfImportedPage importedPage; string outputPdfPath=@"C:/pdf/new.pdf"; sourceDocument = new Document(); pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create)); //Open the output file sourceDocument.Open(); try { //Loop through the files list for (int f = 0; f < lstFiles.Length-1; f++) { int pages =get_pageCcount(lstFiles[f]); reader = new PdfReader(lstFiles[f]); //Add pages of current file for (int i = 1; i <= pages; i++) { importedPage = pdfCopyProvider.GetImportedPage(reader, i); pdfCopyProvider.AddPage(importedPage); } reader.Close(); } //At the end save the output file sourceDocument.Close(); } catch (Exception ex) { throw ex; } private int get_pageCcount(string file) { using (StreamReader sr = new StreamReader(File.OpenRead(file))) { Regex regex = new Regex(@"/Type\s*/Page[^s]"); MatchCollection matches = regex.Matches(sr.ReadToEnd()); return matches.Count; } } 

यहाँ कुछ कोड है जिसे मैंने एक पुराने प्रोजेक्ट से निकाला था। यह एक वेब अनुप्रयोग था, लेकिन मैं पीडीएफ फाइलों को मर्ज करने के लिए iTextSharp का प्रयोग कर रहा था, फिर उन्हें मुद्रित करें।

 public static class PdfMerger { /// <summary> /// Merge pdf files. /// </summary> /// <param name="sourceFiles">PDF files being merged.</param> /// <returns></returns> public static byte[] MergeFiles(List<Stream> sourceFiles) { Document document = new Document(); MemoryStream output = new MemoryStream(); try { // Initialize pdf writer PdfWriter writer = PdfWriter.GetInstance(document, output); writer.PageEvent = new PdfPageEvents(); // Open document to write document.Open(); PdfContentByte content = writer.DirectContent; // Iterate through all pdf documents for (int fileCounter = 0; fileCounter < sourceFiles.Count; fileCounter++) { // Create pdf reader PdfReader reader = new PdfReader(sourceFiles[fileCounter]); int numberOfPages = reader.NumberOfPages; // Iterate through all pages for (int currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++) { // Determine page size for the current page document.SetPageSize( reader.GetPageSizeWithRotation(currentPageIndex)); // Create page document.NewPage(); PdfImportedPage importedPage = writer.GetImportedPage(reader, currentPageIndex); // Determine page orientation int pageOrientation = reader.GetPageRotation(currentPageIndex); if ((pageOrientation == 90) || (pageOrientation == 270)) { content.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(currentPageIndex).Height); } else { content.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0); } } } } catch (Exception exception) { throw new Exception("There has an unexpected exception" + " occured during the pdf merging process.", exception); } finally { document.Close(); } return output.GetBuffer(); } } /// <summary> /// Implements custom page events. /// </summary> internal class PdfPageEvents : IPdfPageEvent { #region members private BaseFont _baseFont = null; private PdfContentByte _content; #endregion #region IPdfPageEvent Members public void OnOpenDocument(PdfWriter writer, Document document) { _baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); _content = writer.DirectContent; } public void OnStartPage(PdfWriter writer, Document document) { } public void OnEndPage(PdfWriter writer, Document document) { } public void OnCloseDocument(PdfWriter writer, Document document) { } public void OnParagraph(PdfWriter writer, Document document, float paragraphPosition) { } public void OnParagraphEnd(PdfWriter writer, Document document, float paragraphPosition) { } public void OnChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title) { } public void OnChapterEnd(PdfWriter writer, Document document, float paragraphPosition) { } public void OnSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title) { } public void OnSectionEnd(PdfWriter writer, Document document, float paragraphPosition) { } public void OnGenericTag(PdfWriter writer, Document document, Rectangle rect, string text) { } #endregion private float GetCenterTextPosition(string text, PdfWriter writer) { return writer.PageSize.Width / 2 - _baseFont.GetWidthPoint(text, 8) / 2; } } 

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

 public Stream addPrintJStoPDF(Stream thePDF) { MemoryStream outPutStream = null; PRStream finalStream = null; PdfDictionary page = null; string content = null; //Open the stream with iTextSharp var reader = new PdfReader(thePDF); outPutStream = new MemoryStream(finalStream.GetBytes()); var stamper = new PdfStamper(reader, (MemoryStream)outPutStream); var jsText = "var res = app.setTimeOut('this.print({bUI: true, bSilent: false, bShrinkToFit: false});', 200);"; //Add the javascript to the PDF stamper.JavaScript = jsText; stamper.FormFlattening = true; stamper.Writer.CloseStream = false; stamper.Close(); //Set the stream to the beginning outPutStream.Position = 0; return outPutStream; } 

सुनिश्चित नहीं है कि ऊपर के कोड को कितनी अच्छी तरह से लिखा गया है क्योंकि मैं इसे कहीं और से खींचा था और मैंने गहनता से iTextSharp के साथ काम नहीं किया है, लेकिन मुझे पता है कि मैंने पीडीएफ़ को विलय करने में काम किया है जो मैं क्रम में पैदा कर रहा था।

ITextSharp-LGPL 4.1.6 के साथ परीक्षण किया गया:

  public static byte[] ConcatenatePdfs(IEnumerable<byte[]> documents) { using (var ms = new MemoryStream()) { var outputDocument = new Document(); var writer = new PdfCopy(outputDocument, ms); outputDocument.Open(); foreach (var doc in documents) { var reader = new PdfReader(doc); for (var i = 1; i <= reader.NumberOfPages; i++) { writer.AddPage(writer.GetImportedPage(reader, i)); } writer.FreeReader(reader); reader.Close(); } writer.Close(); outputDocument.Close(); var allPagesContent = ms.GetBuffer(); ms.Flush(); return allPagesContent; } } 

उल्लेख मेमोरी मुद्दों से बचने के लिए, मैंने मेमोरी स्ट्रीम के बजाय फ़ाइल स्ट्रीम का इस्तेमाल किया ( आईटीकेक्सएसपीआरपी में वर्णित मेमोरी अपवाद मल्टीपल पीडीएफ मर्ज करने के लिए) पीडीएफ फाइलों को मर्ज करने के लिए:

  var parentDirectory = Directory.GetParent(SelectedDocuments[0].FilePath); var savePath = parentDirectory + "\\MergedDocument.pdf"; using (var fs = new FileStream(savePath, FileMode.Create)) { using (var document = new Document()) { using (var pdfCopy = new PdfCopy(document, fs)) { document.Open(); for (var i = 0; i < SelectedDocuments.Count; i++) { using (var pdfReader = new PdfReader(SelectedDocuments[i].FilePath)) { for (var page = 0; page < pdfReader.NumberOfPages;) { pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfReader, ++page)); } } } } } }