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

PDF example 1

PDF example 2

यह दो पेज का पीडीएफ है। इसे एक बनाने की जरूरत है, यह याद रखना कि यह गतिशील है, यह बहुत लंबा हो सकता है।

मैं इसे कैसे बना सकता हूं इसका कोड नमूना:

Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfDirectoryPath + 
    "temp.pdf"));
writer.setStrictImageSequence(true);
document.open();

Font bold = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 20, BaseColor.BLACK);

Chunk nomeFantasiaChunk = new Chunk(nomeFantasia, bold );
Paragraph paragrafoNomeFantasia = new Paragraph(nomeFantasiaChunk);
paragrafoNomeFantasia.setAlignment(Element.ALIGN_CENTER);
document.add(paragrafoNomeFantasia);

document.close();

मैं इसे कैसे प्रिंट करता हूं इसका कोड नमूना (पीडीएफबॉक्स का उपयोग करके ठीक काम करता है):

private void printPDF(PrintService print, String fileName) {
    try {
        PDDocument document = PDDocument.load(new FileInputStream(Constants.pdf + fileName));
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPageable(new PDFPageable(document));

        // define custom paper
        Paper paper = new Paper();
        paper.setSize(225, 396); // 1/72 inch
        paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); // no margins

        // custom page format
        PageFormat pageFormat = new PageFormat();
        pageFormat.setPaper(paper);

        // override the page format
        Book book = new Book();
        // append all pages
        book.append(new PDFPrintable(document), pageFormat, document.getNumberOfPages());
        job.setPageable(book);
        job.setPrintService(print);
        job.print();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

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

यह एक, उदाहरण के लिए: बहुपृष्ठ वाले PDF दस्तावेज़ के एक पृष्ठ से नया एकल-पृष्ठ-पीडीएफ दस्तावेज़ बनाएं

वह कोड काम करता है, लेकिन मैं यह नहीं समझ सकता कि सामग्री को एक पृष्ठ में कैसे रखा जाए, यह मूल दस्तावेज़ की प्रतिकृति बनाकर समाप्त होता है।

अगर आप मेरी मदद कर सकते हैं, तो मैं आपको धन्यवाद देता हूं!

0
Jorge do Carmo 31 मार्च 2020, 17:25

1 उत्तर

सबसे बढ़िया उत्तर

काफी शोध के बाद मैं आखिरकार इसे हल कर सका। इस लेख ने मेरी मदद की: पीडीएफ दस्तावेज़ों को एक पेज iText में मर्ज करें

मुझे कोड को थोड़ा संशोधित करना पड़ा। इसके कुछ हिस्से हैं जो मुझे बिल्कुल भी समझ नहीं आ रहे हैं, और यह ठीक से काम नहीं कर रहा है।

तो, संपादन के साथ, यह इस तरह समाप्त हुआ:

PdfReader reader = new PdfReader(pdfDirectoryPath + "temp.pdf");
Rectangle pageSize = reader.getPageSize(1);
Rectangle newSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight() * 
    reader.getNumberOfPages());
Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight());
int n = (int)Math.pow(2, reader.getNumberOfPages());
int r = (int)Math.pow(2, reader.getNumberOfPages() / 2);
int c = n / r;

Document document2 = new Document(newSize);
PdfWriter writer2 = PdfWriter.getInstance(document2, new 
     FileOutputStream(pdfDirectoryPath + fileName));
document2.open();
document2.newPage();
PdfContentByte cb = writer2.getDirectContent();
PdfImportedPage page;

float offsetY, factor;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
     page = writer2.getImportedPage(reader, i);
     Rectangle currentSize = reader.getPageSize(i);
     factor = Math.min(
     unitSize.getWidth() / currentSize.getWidth(),
     unitSize.getHeight() / currentSize.getHeight());
     offsetY = newSize.getHeight() - (unitSize.getHeight() * (((i % n) / c) + 1))
              + (unitSize.getHeight() - (currentSize.getHeight() * factor)) / 2f;
     if (i > 1) {
        offsetY += 150;
     }
     cb.addTemplate(page, factor, 0, 0, factor, 0, offsetY);
}
document2.close();
reader.close();

अब एक आकर्षण की तरह काम करता है। मेरे पास दो पृष्ठों की सभी सामग्री अब एक ही गतिशील पृष्ठ में है जिसमें विभिन्न पृष्ठों की सामग्री के बीच अंतराल नहीं है।

0
Jorge do Carmo 1 अप्रैल 2020, 19:08