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



我必须使用itext裁剪PDF文档,但最终输出的PDF不是我提供的矩形坐标来裁剪的PDF。我已经在这个路径上传了样本文件。

https://onedrive.live.com/redir?resid=445455D417418FDD%21123

onedrive.live.com/redir?resid=4455455D417418FDD%21124

onedrive.live.com/redir?resid=4455455D417418FDD%21125

onedrive.live.com/redir?resid=4455455D417418FDD%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();

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

看看我书中的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是左下角的xy坐标,urx, ury是右上角的xy坐标。

Bruno的方法是正确的裁剪方法(他是iText的创建者,他知道)。但既然你已经有了一条路要走了,我会尽力帮助你的。

你不是真正的裁剪,而是试图创建一个特定大小的新文档,然后添加原始文档,但要将其移动以适应你的新"窗口"。我想最终的结果和裁剪是一样的。

CCD_ 19的重载之一是采用变换矩阵的重载。在您的案例中,您想要翻译由[1, 0, 0, 1, tx, ty]标识的内容,最后两个元素是您需要弄清楚的。对于这个特定的PDF文档,您可以使用:

cb.AddTemplate(page, 1, 0, 0, 1, -36, -36);

编辑

神奇的数字-34实际上应该是-36,对不起。36表示文档的各种框的大小(Bruno所说的),这些框将文档的可视区域从每个大小缩小36。使用您尝试使用的方法,您需要检查导入文档的"裁剪"框(可能也有"出血和修剪"?)并将其考虑在内。

最新更新