假设我有一堆要迁移为新pdf的pdf文件。但是新的pdf文件是表结构文件。 pdf文件的内容应适合两列表的第一个单元格。 我不确定使用表的方法是否正确。我愿意接受任何其他解决方案。我想要的是最后在顶部添加一些自定义文本,然后是pdf内容,然后是右侧的复选框。 (每个pdf内容一个)
到目前为止我所拥有的: `
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc, PageSize.A4);
doc.SetMargins(0f, 0f, 18f, 18f);
PdfReader reader = new PdfReader(src);
PdfDocument srcDoc = new PdfDocument(reader);
Table table = new Table(new float[] { 2f, 1f });
PdfFormXObject imagePage = srcDoc.GetFirstPage().CopyAsFormXObject(pdfDoc);
var image = new Image(imagePage);
Cell cell = new Cell().Add(image);
cell.SetHorizontalAlignment(HorizontalAlignment.LEFT);
cell.SetVerticalAlignment(VerticalAlignment.TOP);
table.AddCell(cell);
Table checkTable = new Table(2);
Cell cellCheck1 = new Cell();
cellCheck1.SetNextRenderer(new CheckboxCellRenderer(cellCheck1, "cb1", 0));
cellCheck1.SetHeight(50);
checkTable.AddCell(cellCheck1);
Cell cellCheck2 = new Cell();
cellCheck2.SetNextRenderer(new CheckboxCellRenderer(cellCheck2, "cb2", 1));
cellCheck2.SetHeight(50);
checkTable.AddCell(cellCheck2);
table.AddCell(checkTable);
doc.Add(table);
doc.Close();`
我的问题是pdf内容仍有空白。这完全破坏了设计。非常令人沮丧,我非常感谢您的帮助。
答案 0 :(得分:0)
你说
我的问题是pdf内容仍有空白。完全破坏了设计。
PDF(通常)对边距一无所知。因此,您必须检测要首先导入的页面的页边距。您可以通过将页面内容解析为事件侦听器来实现,该事件侦听器会跟踪绘图指令的边界框,例如TextMarginFinder
。然后,您可以将源页面缩小为这些尺寸。这可以通过以下方法完成:
PdfPage restrictToText(PdfPage page)
{
TextMarginFinder finder = new TextMarginFinder();
new PdfCanvasProcessor(finder).ProcessPageContent(page);
Rectangle textRect = finder.GetTextRectangle();
page.SetMediaBox(textRect);
page.SetCropBox(textRect);
return page;
}
在将页面复制为XObject之前,即在您的代码中应用此方法,即替换
PdfFormXObject imagePage = srcDoc.GetFirstPage().CopyAsFormXObject(pdfDoc);
作者
PdfFormXObject imagePage = restrictToText(srcDoc.GetFirstPage()).CopyAsFormXObject(pdfDoc);
这将导致将Image
嵌入此XObject以具有正确的大小。不幸的是,由于受限制的页面仍具有与原始页面相同的坐标系,只是其裁切框所定义的区域比以前小,因此其位置可能会有些许错误。要解决此问题,必须应用偏移量,必须减去页面裁剪框(已成为XObject边界框)的左下角的坐标。因此,在实例化Image
之后,添加以下代码:
Rectangle bbox = imagePage.GetBBox().ToRectangle();
image.SetProperty(Property.LEFT, -bbox.GetLeft());
image.SetProperty(Property.BOTTOM, -bbox.GetBottom());
image.SetProperty(Property.POSITION, LayoutPosition.RELATIVE);
现在,受限制的页面已正确放置在表格单元格中。
当心:TextMarginFinder
(如其名称所示)仅通过文本确定边距。因此,如果页面也包含其他内容,例如如徽标的装饰,此徽标将被忽略,并可能最终被切掉。如果您也需要这种装饰,则必须在概述中使用其他的边距查找器类。