当前位置: 首页 > 知识库问答 >
问题:

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

辛承志
2023-03-14

我在这里搜索了很多关于这方面的文章。我找到了一些,但没有一个能满足我的需要。那么,让我们开始吧。我正在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动态设置为一个页面。我发现一些文章更接近于,但从来没有真正的匹配解决方案。

例如:从多页PDF文档的一页创建新的单页PDF文档

这段代码可以工作,但我不知道如何将内容放在一个页面中,它最终会生成原始文档的副本。

如果你能帮助我,我感谢你!

共有1个答案

荣曾笑
2023-03-14

经过大量研究,我终于可以解决这个问题。这篇文章帮助了我:将pdf文档合并到单个页面的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();

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

 类似资料:
  • 我有一个代码,实际上是一个数学表格编码器...如果有人按下按钮,函数被调用并正在运行...但是当我点击按钮时,表格会出现在一个新的页面上,而不是在同一个页面上... 我已经尝试过用document.getElementByID('div1'). innerHTML=i;但是代码也不起作用,我确定这是初学者的错误,但是什么:)? 提前谢谢!

  • 我正在开发一个NetBeans插件,它需要使用“动态”菜单,因为目前必须在专用于某个菜单项及其操作的类中硬编码。然而,我希望允许用户通过插件提供的UI更改菜单项的值(它们的作用-这将在主方法中处理变量,我不允许用户为主方法本身编写代码-它们被调用的内容及其关联的键盘快捷键),以及添加和删除菜单项。我的插件可能会从一个文件中读取这些首选项,理想情况下,只有一个类可以创建所有这些动态菜单项,其值在首选

  • 我正在尝试从Java结果集创建PDF报告。如果报告只有一页,我在这里就没有问题了。这个问题源于这样一个事实:这份报告可能有一到十页长。现在,我要创建一个单页文档: 所以我的问题是,如何根据需要动态创建页面。有没有一个面向对象的答案盯着我看,而我就是看不见?

  • 问题内容: 我有以下查询,该查询返回,商店编号及其区域以及2016年商店销售额的总和。 我将如何添加第四列,以总结每个商店所在区域的销售额。 每个区域有许多存储,因此,在相同区域中具有存储的每个ROW上,该值将相同。 希望我能解释清楚吗? 问题答案: 您可以使用窗口功能:

  • 我们在没有任何产品数据的情况下设置了hybris,产品存储在MDM中,并使用另一个系统(Java app)在前端显示。当用户单击上游系统上的checkout以在hybris中创建产品时,请求被发送到hybris。hybris中是否有OOTB API,允许我们动态创建包含所有必填字段的产品。

  • 我知道如何在MVC中创建视图。