使用itext裁剪PDF文档会返回不需要的输出

时间:2014-04-12 10:31:16

标签: c# pdf itextsharp itext itextpdf

我必须使用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();

2 个答案:

答案 0 :(得分:1)

我不了解您的代码示例,更具体地说:我不明白为什么要使用该代码裁剪网页。请允许我忽略您的代码,并解释如何裁剪页面。

查看我书中的RotatePages示例。在ManipulatePdf()方法中,我遍历页面,我使用页面字典,然后更改/Rotate键以旋转页面。这不是你需要的,但原则是相似的。

您需要从页面词典中获取/MediaBox/CropBox值:

PdfArray mediabox = pageDict.getAsArray(PdfName.MEDIABOX);
PdfArray cropbox = pageDict.getAsArray(PdfName.CROPBOX);

在许多情况下,cropbox将为null,在这种情况下,您可以放心地忽略它并使用mediabox值。

cropbox值(或nullmediabox)是一个包含4个值的数组。这些值表示两个坐标:一个用于页面的左下角,另一个用于页面的右上角。如果要裁剪页面,则需要更改这些坐标并替换现有的cropbox值(如果已存在)或添加新的cropbox值(如果没有)。

pageDict.put(PdfName.CROPBOX, new PdfArray(new float[]{llx, lly, urx, ury}));

llx, lly左下角的xy坐标以及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。使用您尝试使用的方法,您需要检查导入文档的裁剪框(也可能是出血和修剪?)并考虑到这一点。