0

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

2 回答 2

1

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

您不是真正的裁剪,而是尝试创建一个特定大小的新文档,然后添加原始文档,但将其移动以适合您的新“窗口”。最终结果与我猜的裁剪相同。

to 的重载PdfContentByte.AddTemplate()之一是采用变换矩阵的重载。在您的情况下,您想要翻译由[1, 0, 0, 1, tx, ty]最后两个元素标识的内容,这是您需要弄清楚的。对于这个特定的 PDF 文档,您可以使用:

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

编辑

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

于 2014-04-12T15:47:23.810 回答
1

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

看看我书中的RotatePages示例。在该ManipulatePdf()方法中,我遍历页面,获取页面字典,并更改/Rotate键以旋转页面。这不是你需要的,但原理是相似的。

您需要从页面字典中获取/MediaBoxand值:/CropBox

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

在许多情况下,您cropbox可以null放心地忽略它并改用该mediabox值。

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

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

哪里llx, lly是左下角的x和坐标, 是右上角的和坐标。yurx, uryxy

于 2014-04-12T11:31:21.680 回答