【问题标题】:Create a single dynamic page PDF in ITextPDF Java在 ITextPDF Java 中创建单个动态页面 PDF
【发布时间】:2020-03-31 14:25:24
【问题描述】:

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

这是一个两页的 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】:

    经过大量研究,我终于可以解决这个问题。 这篇文章帮助了我: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();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2012-09-06
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多