我必须使用itext裁剪PDF文档,但结果输出pdf不是我提供矩形的坐标来裁剪相同的。 我已在此路径上上传了示例文件。
https://onedrive.live.com/redir?resid=445455D417418FDD%21123
onedrive.live.com/redir?resid=445455D417418FDD%21124
onedrive.live.com/redir?resid=445455D417418FDD%21125
onedrive.live.com/redir?resid=445455D417418FDD%21126
我正在使用此代码。
PdfReader reader = new PdfReader(docpath);
iTextSharp.text.Rectangle size = new iTextSharp.text.Rectangle(24, 144, 270, 348);
iTextSharp.text.Document document = new iTextSharp.text.Document(size);
string tempdocpath = docpath.Replace(".pdf", "_.pdf");
tempdocpath = tempdocpath.Replace(".PDF", "_.PDF");
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(tempdocpath, FileMode.Create, FileAccess.Write));
document.Open();
PdfContentByte cb = writer.DirectContent;
document.NewPage();
PdfImportedPage page = writer.GetImportedPage(reader, pageNumber);
cb.AddTemplate(page, 0, 0);
document.Close();
writer.Close();
答案 0 :(得分:1)
我不了解您的代码示例,更具体地说:我不明白为什么要使用该代码裁剪网页。请允许我忽略您的代码,并解释如何裁剪页面。
查看我书中的RotatePages示例。在ManipulatePdf()
方法中,我遍历页面,我使用页面字典,然后更改/Rotate
键以旋转页面。这不是你需要的,但原则是相似的。
您需要从页面词典中获取/MediaBox
和/CropBox
值:
PdfArray mediabox = pageDict.getAsArray(PdfName.MEDIABOX);
PdfArray cropbox = pageDict.getAsArray(PdfName.CROPBOX);
在许多情况下,cropbox
将为null
,在这种情况下,您可以放心地忽略它并使用mediabox
值。
cropbox
值(或null
,mediabox
)是一个包含4个值的数组。这些值表示两个坐标:一个用于页面的左下角,另一个用于页面的右上角。如果要裁剪页面,则需要更改这些坐标并替换现有的cropbox
值(如果已存在)或添加新的cropbox
值(如果没有)。
pageDict.put(PdfName.CROPBOX, new PdfArray(new float[]{llx, lly, urx, ury}));
llx, lly
左下角的x
和y
坐标以及urx, ury
的{{1}}和x
坐标是y
右上角。
答案 1 :(得分:1)
布鲁诺的方法是适当的裁剪方法(他知道,他是iText的创造者)。但是既然你已经有了一条路,那么我就会试着帮助你。
而不是真正裁剪,而是尝试创建特定大小的新文档,然后添加原始文档,但将其移动以适合新的“窗口”。最终结果与裁剪相同。
PdfContentByte.AddTemplate()
的一个重载是采用变换矩阵的重载。在您的情况下,您希望翻译由[1, 0, 0, 1, tx, ty]
标识的最后两个元素,这是您需要弄清楚的。对于此特定PDF文档,您可以使用:
cb.AddTemplate(page, 1, 0, 0, 1, -36, -36);
修改强>
幻数-34
实际应该是-36
,对不起。 36
表示文档的各种框(Bruno所说的)的大小,它将文档的可视区域从每个大小缩小了36。使用您尝试使用的方法,您需要检查导入文档的裁剪框(也可能是出血和修剪?)并考虑到这一点。