在ITextPDF Java中创建单个动态页面PDF

问题描述 投票:0回答:1

我在这里搜索了许多关于此的文章。我找到了一些,但没有一个能满足我的需要。所以,让我们开始吧。我正在ITextPDF中创建一个文件,然后需要打印。文件的内容是动态的。因此,PDF有时会将内容分成页面,当我打印它时,页面之间的间隙在纸张中显示出很大的空间(我需要在热敏打印机中以单页打印)。因此,我花了几天的时间试图找出任何解决方案,但仍然找不到。对于打印,我使用的是PDFBox,效果很好。只需要立即正确对齐PDF。

PDF example 1

PDF example 2

这是两页的PDF。需要使它成为一体,记住这是动态的,可能会更长。

我如何创建的代码示例:

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();

我如何打印它的代码示例(使用PDFBox可以正常工作:

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动态设置为一页。我发现有些文章更接近一些,但从未找到真正的解决方案。

例如,这个:Create new single-page-PDF document from one page of a multipage PDF document

该代码有效,但是我无法弄清楚如何将内容放入一页中,最终形成了原始文档的副本。

如果您能帮助我,我谢谢您!

java pdf itext
1个回答
0
投票

经过大量研究,我终于可以解决这个问题。这篇文章对我有帮助:Merge pdf documents into a single page 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();

现在的工作就像一种魅力。我在两页中拥有的所有内容现在都在一个动态页面中,而在不同页面的内容之间没有空隙。

© www.soinside.com 2019 - 2024. All rights reserved.