iText.Layout.Document 无视 space 合并后的 pdf
iText.Layout.Document disregards space taken by merged pdf
我创建包含文本、图像和现有 pdf 的 pdf。现有的 pdf 是通过将它们合并到 pdf 中来添加的。问题是,如果首先添加一个 pdf,然后添加一个图像 iText.Layout.Document 不考虑合并后的 pdf 拍摄的 space 而是在 "Document Title" 段落之后添加图像(参见示例).
这会产生乱序图像,有时甚至会重叠图像和合并的 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)));
}
如果评论中建议的方法(为 merging/appending 在内存中创建文档)由于性能问题而无法实现,并且您不介意将内容添加到文档的新页面上,您可以试试这个方法:
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 中编写了代码示例,但是 Java 的 iText 和 .NET 共享完全相同的代码库,所以这应该不是问题。
在这种方法中,我们强制 iText 在向高级文档 class 添加内容之前添加一个新页面。如果您想使用这种方法添加图像,您必须将它们包装在 IBlockElement 中才能使该方法起作用。最合适的元素是Div。
此致,
凯文
我创建包含文本、图像和现有 pdf 的 pdf。现有的 pdf 是通过将它们合并到 pdf 中来添加的。问题是,如果首先添加一个 pdf,然后添加一个图像 iText.Layout.Document 不考虑合并后的 pdf 拍摄的 space 而是在 "Document Title" 段落之后添加图像(参见示例).
这会产生乱序图像,有时甚至会重叠图像和合并的 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)));
}
如果评论中建议的方法(为 merging/appending 在内存中创建文档)由于性能问题而无法实现,并且您不介意将内容添加到文档的新页面上,您可以试试这个方法:
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 中编写了代码示例,但是 Java 的 iText 和 .NET 共享完全相同的代码库,所以这应该不是问题。
在这种方法中,我们强制 iText 在向高级文档 class 添加内容之前添加一个新页面。如果您想使用这种方法添加图像,您必须将它们包装在 IBlockElement 中才能使该方法起作用。最合适的元素是Div。
此致, 凯文