我正在使用iText(特别是iTextSharp 4.1.6),我想通过组合现有PDF中的页面来创建一个PDF,但也要插入从图像创建的新页面。
我已经分别使用PdfCopy和PdfWriter实现了这两个部分的工作。从图像创建页面的代码如下所示:
PdfWriter pw = PdfWriter.GetInstance(doc, outputStream);
Image img = Image.GetInstance(inputStream);
doc.Add(img);
doc.NewPage();
现在,由于PdfCopy继承自PdfWriter,我想我可以使用相同的技术将这样的“图像页面”添加到我的PdfCopy对象中,但这不起作用(如果在上面的示例中实例化一个PdfCopy而不是PdfWriter,页面上什么也不会出现)。
通过快速查看源代码,我注意到当PdfCopy的contstructor调用超类构造函数时,它使用的是一个新的Document对象,而不是传入的对象,所以我想这就是原因。
有没有更好的办法呢?目前,我的最佳猜测是使用PdfWriter从图像创建一个单页Pdf,然后使用PdfCopy将其添加到文档中,但这似乎有点变通。
我最近有这个问题,这里的答案实际上没有那么有用。我的用例基本上是“取一堆PDF和图像(.jpg、.png等)并将它们全部组合成一个PDF”。我不得不使用PdfCopy,因为它保留了表单字段和标签,而PdfWriter没有。
基本上,因为PdfCopy不允许您使用addPage()创建新页面,所以您必须在内存中创建一个新的PDF,其中包含页面上的图像,然后使用PdfCopy从该PDF中复制出该页面。
例如:
Document pdfDocument = new Document();
ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();
PdfCopy copy = new PdfCopy(pdfDocument, pdfOutputStream);
pdfDocument.open();
for (File file : allFiles) {
if (/* file is PDF */) {
/* Copy all the pages in the PDF file into the new PDF */
PdfReader reader = new PdfReader(file.getAllBytes());
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
copy.addPage(copy.getImportedPage(reader, i);
}
} else {
/* File is image. Create a new PDF in memory, write the image to its first page, and then use PdfCopy to copy that first page back into the main PDF */
Document imageDocument = new Document();
ByteArrayOutputStream imageDocumentOutputStream = new ByteArrayOutputStream();
PdfWriter imageDocumentWriter = PdfWriter.getInstance(imageDocument, imageDocumentOutputStream);
imageDocument.open();
if (imageDocument.newPage()) {
image = Image.getInstance(file.getAllBytes());
if (!imageDocument.add(image)) {
throw new Exception("Unable to add image to page!");
}
imageDocument.close();
imageDocumentWriter.close();
PdfReader imageDocumentReader = new PdfReader(imageDocumentOutputStream.toByteArray());
copy.addPage(copy.getImportedPage(imageDocumentReader, 1));
imageDocumentReader.close();
}
}
使用iTextSharp,您可以通过将事件附加到PDF来向PDF添加页眉/页脚,如本SO答案中所述:https://stackoverflow.com/a/19004392 我怎样才能用 iText 7 做同样的事情? 这个链接有Java代码示例,但看起来不像它使用的页面事件。
我正在使用iText 5.3.5创建一个pdf文档。现在,我正试图在文档的每一页上得到一个矩形,但我不太确定如何做到这一点。我试着在代码的末尾添加这个(我是在网上找到的): 但这只是在最后一页添加了矩形,这有点意义,因为我没有在任何地方使用pgCnt。我如何指定我想要页号pgCnt上的矩形,以便我可以在每一页上添加矩形? 希望我能解释清楚。提前感谢你的帮助。:)
null null
在浏览了几天的网页和帖子之后,我仍然对如何将“csv”文件附件添加到使用Java“iText 5.3.1”创建的PDF文件中感到困惑。 在我继承的Java可执行文件中,创建了多个PDF文件,然后将它们连接到一个PDF文件中。现在,需要将一个“csv”文件附加到这个PDF文档中。在《iText in Action》(清单16.6)一书的第16章中,有一个例子使用PdfileSpecification
问题内容: 我需要有关iText的帮助。我需要在其他现有的iText文档或PDF文档中添加现有的pdf封面。有人可以帮助我吗?我已经搜索了一些书籍(iText在使用中),但有些复杂。 问题答案: 假设我们有一个名为pages.pdf的文档,并且我们想添加封面hero.pdf作为本文档的封面。 方法1: 使用 看一下AddCover1示例: 结果是一个文档,在这里您首先有封面,然后是文档的其余部分:
我不需要添加书签或其他动态内容,只需要添加一些具有名称的目的地,从而注入一个/Dests集合,该集合具有在生成的PDF中定义的名称。 我使用了iText 5.3.0并且阅读了iText Inaction(第2版)的第7章,但是我仍然不知道如何添加目的地,所以在浏览器中使用#namedest。 我正在用PdfReader和PDFStamper阅读和操作文档。在使用定制的侦听器和PdfContentS