iText.Layout.Document 忽略合并的 pdf 所占用的空间



我创建包含文本,图像和现有pdf的pdf。通过将现有 pdf 合并到 pdf 中来添加它们。问题是,如果首先添加pdf,然后添加图像,则iText.Layout.Document不考虑合并的pdf所占用的空间,而是在"文档标题"段落之后添加图像(请参阅示例(。

这会产生无序图像,有时甚至会重叠图像和合并的pdf。我需要正确的顺序并且没有重叠,我该如何解决这个问题?

using (var stream = new MemoryStream())
using (var writer = new PdfWriter(stream).SetSmartMode(true))
using (var pdf = new PdfDocument(writer))
using (var doc = new Document(pdf))
{
doc.Add(new Paragraph("Document Title")
//pdf is added via merging, results in pdf being on the second page which is ok
using (var ms = new MemoryStream(somePdfByteArray))
using (var reader = new PdfReader(ms))
using (var pdfdoc = new PdfDocument(reader))
{
PdfMerger merger = new PdfMerger(pdf);
merger.Merge(pdfdoc, 1, pdfdoc.GetNumberOfPages());
}
//then image is added but it is added BEFORE the pdf which is the problem
doc.Add(new Image(ImageDataFactory.Create(someImageByteArray)));
}

如果由于性能问题而无法使用注释中建议的方法(在内存中创建用于合并/追加的文档(,并且您不介意将内容添加到文档的新页面上,则可以尝试此方法:

public static void main(String[] args) throws Exception {
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(DEST));
addContent(new Paragraph("Document Title"), pdfDocument);
mergePdf(new PdfDocument(new PdfReader(SRC)), pdfDocument);
addContent(new Div().add(new Image(ImageDataFactory.create("path_to_image"))), pdfDocument);
pdfDocument.close();
}
public static void mergePdf(PdfDocument in, PdfDocument pdfDocument) throws Exception {
in.copyPagesTo(1, in.getNumberOfPages(), pdfDocument, new PdfPageFormCopier());
}
public static void addContent(IBlockElement content, PdfDocument pdfDocument) throws Exception {
Document document = new Document(pdfDocument);
pdfDocument.addNewPage();
document.add(new AreaBreak(AreaBreakType.LAST_PAGE));
document.add(content);
}

我用Java编写了代码示例,但是iText for Java和.NET共享完全相同的代码库,所以这应该不是问题。

在这种方法中,我们强制 iText 在添加高级文档类的内容之前添加新页面。如果要使用此方法添加图像,则必须将它们包装在IBlockElement中才能使此方法正常工作。最合适的元素是Div元素。

问候 凯文

最新更新