实际上用PDF Clown裁剪PDF

时间:2016-06-06 09:07:42

标签: pdf pdfclown

我的目标实际上是使用PdfClown裁剪PDF文件。 有很多工具/库允许裁剪PDF,更改PDF cropBox。这允许将内容隐藏在矩形区域之外,但内容仍然存在,可以通过PDF解析器访问,并且PDF大小不会改变。

相反,我需要的是创建一个只包含矩形区域内的内容的新页面。

到目前为止,我已尝试扫描内容并有选择地克隆它们。但我还没有成功。有关使用PdfClown的任何建议吗?

我见过有人正在尝试与PdfBox Cropping a region from a PDF page with PDFBox类似的东西但还没有成功。

1 个答案:

答案 0 :(得分:0)

有点晚了,但也许对某人有帮助; 我成功地完成了您要的内容-但是使用了其他库。 所需的库:iText 4或5和Ghostscript

使用伪代码的步骤1

使用iText创建带有空白Doc的PDFWRITER实例。将PDFREADER对象打开到要裁剪的原始文件。导入页面,从源中获取PDFTemplate对象,将其 .boundingBox 属性设置为所需的裁剪框,将模板包装到iText Image对象中,然后将其粘贴到新页面的绝对位置。 / p>

Dim reader As New PdfReader(sourcefile)
Dim doc As New Document()
Dim writer As PdfWriter = PdfWriter.GetInstance(doc, New System.IO.FileStream(outputfilename, System.IO.FileMode.Create))

//get the source page as an Imported Page
Dim page As PdfImportedPage = writer.GetImportedPage(reader, indexOfPageToGet) page

//create PDFTemplate Object at original size from source - see iText in Action book Page 91 for full details
Dim pdftemp As PdfTemplate = page.CreateTemplate(page.Width, page.Height) 
//paste the original page onto the template object, see iText documentation what those parameters do (scaling, mirroring)
pdftemp.AddTemplate(page, 1, 0, 0, 1, 0, 0)
//now the critical part - set .boundingBox property on the template. This makes all objects outside the rectangle invisible
pdftemp.boundingBox = {iText Rectangle Structure with new Cropbox}
//template not needed anymore
writer.ReleaseTemplate(pdftemp) 
//create an iText IMAGE object as wrapper to the template - with this img object absolute positionion on the final page is much easier
dim img as iTextSharp.Text.Image = Image.GetInstance(pdftemp)
// set img position
img.SetAbsolutePosition(x, y)
//set optional Rotation if needed
img.RotationDegrees = 0
//finally, this adds the actual content to the new document
doc.Add(img) 
//cleanup
doc.Close()
reader.Close()
writer.Close()

输出文件将在视觉上被裁剪。但是对象仍然存在于PDF流中。文件大小可能仍会保持很小的变化。

第2步:

使用Ghostscript和输出设备pdfwrite,再加上正确的命令行参数,您可以从步骤1重新处理PDF。这将为您提供更小的PDF。有关参数https://www.ghostscript.com/doc/9.52/Use.htm,请参见Ghostscript文档。 此步骤实际上摆脱了边界框之外的对象,这是您在OP中要求的要求,至少对于我要处理的文件而言。

可选步骤3: 将MUTOOL与-g选项一起使用,可以清除未使用的XREF对象。您的原始PDF可能有很多外部参照,这会增加文件大小。裁剪后,可能不再需要其中的一些。 https://mupdf.com/docs/manual-mutool-clean.html

PDF格式是一件棘手的事情,通常我会同意@Tilman Hausherr,我的建议可能不适用于所有文件,并且涵盖了“几乎不可能”的情况,但适用于我处理的所有情况。 / p>

相关问题