我创建包含文本,图像和现有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)));
}
答案 0 :(得分:2)
如果由于性能问题而无法使用注释中建议的方法(在内存中创建文档进行合并/追加),并且您不介意在文档的新页面上添加内容,则可以尝试以下方法:
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在高级Document类上添加内容之前添加新页面。如果要使用此方法添加图像,则必须将它们包装在IBlockElement中,此方法才能起作用。最合适的元素是 Div 一个。
关于, 凯文