gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:40:44 26 4
gpt4 key购买 nike

我在这里搜索了很多关于此的文章。我找到了一些,但没有一个能正常满足我的需要。那么,让我们开始吧。我正在 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

该代码有效,但我不知道如何将内容放入一页,它最终会制作原始文档的副本。

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

最佳答案

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

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

关于java - 在 ITextPDF Java 中创建单个动态页面 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60952964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com