itext 7 c#如何剪辑现有的pdf

时间:2018-12-14 10:17:30

标签: itext itext7

假设我有一堆要迁移为新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内容仍有空白。这完全破坏了设计。非常令人沮丧,我非常感谢您的帮助。

1 个答案:

答案 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(如其名称所示)仅通过文本确定边距。因此,如果页面也包含其他内容,例如如徽标的装饰,此徽标将被忽略,并可能最终被切掉。如果您也需要这种装饰,则必须在概述中使用其他的边距查找器类。