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

在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报告。如果报告只有一页,我在这里就没有问题了。这个问题源于这样一个事实:这份报告可能有一到十页长。现在,我要创建一个单页文档: 所以我的问题是,如何根据需要动态创建页面。有没有一个面向对象的答案盯着我看,而我就是看不见?

  • 作为写文章的补充,Jekyll 还可以创建静态页面。利用 Jekyll 带来的便利,你只需要复制文件或文件夹,就是这么简单。 主页 像任何网站的配置一样,需要按约定在站点的根目录下找到 index.html 文件,这个文件将被做为主页显示出来。除非你的站点设置了其它的文件作为默认文件,这个文件就将是你的 Jekyll 生成站点的主页。 提示: 在主页上使用布局 站点上任何 HTML 文件,包括主页

  • 我们已经设计好了数据表,创建的 Blog 已经安装到了 Plus 程序上,这一章,我们来编写前台所需要的 UI 和逻辑部分。注意,这里不是去拓展 PC 的 UI,而是使用 Bootstrap 3 编写 Blog 的页面,因为我这里拟定你是使用开源版的 Plus 程序。 从这里开始,需要用到的 Laravel 知识 Blade 模板引擎 布局设计 在编写页面前,我们先来设计一下页面大体布局,我们先设

  • 本页介绍了如何创建 MOSN 文档页面。 开始之前 在开始编写 MOSN 文档之前,首先需要你创建一个 MOSN 文档存储库,和熟悉 MOSN 的文档结构。 页面类型 文档 系统化介绍 MOSN 使用的文档,由 MOSN 团队官方维护。 博客 周期化发布的 MOSN 博客,来自社区贡献。 新闻 关于 MOSN 社区的新闻信息。 发布 MOSN 的新版本发布信息。 文档结构 所有文档都位于 cont