使用iTextSharp更改PDF裁剪/媒体框

时间:2015-09-28 07:40:58

标签: pdf itextsharp

我正在尝试使用以下代码更改现有PDF的媒体/裁剪框。

Document document = new Document();
FileStream outputStream = new FileStream(outFile, FileMode.Create);
PdfCopy copy = new PdfSmartCopy(document, outputStream);
document.Open();
foreach (string inFile in inFiles)
{
     PdfReader reader = new PdfReader(inFile);
     float height = Utilities.MillimetersToPoints(388);
     float width = Utilities.MillimetersToPoints(176);
     Rectangle newMedia = new Rectangle(height, width);
     copy.AddDocument(reader, new List<int> { 1 });
     copy.SetBoxSize("crop", newMedia);
     reader.Close();
}
document.Close();

我无法设置媒体框。它总是以相同的价值回归。我缺少什么?

1 个答案:

答案 0 :(得分:1)

每个文档都有一个页面树。这是一个结构,其中/Pages字典为分支,/Page字典为树叶。每个页面字典(页面树中的每个叶子)都对应一个页面。

每个页面词典都有自己的/MediaBox条目(它是必需的条目)。它还可以有一个/CropBox条目(可选,就像ArtBox/BleedBox/TrimBox一样。这些条目可以继承,因此您可以将它们添加到分支(/Pages所属的/Page对象),但可能是现有PDF中的每个页面都有自己的{{1}这将否决在分支级别定义的/MediaBox

因此,我担心您必须更改代码,如我书中的CropPages示例所示:

/MediaBox

换句话说:您必须通过public byte[] ManipulatePdf(byte[] src) { PdfReader reader = new PdfReader(src); int n = reader.NumberOfPages; PdfDictionary pageDict; PdfRectangle rect = new PdfRectangle(55, 76, 560, 816); for (int i = 1; i <= n; i++) { pageDict = reader.GetPageN(i); pageDict.Put(PdfName.CROPBOX, rect); } using (MemoryStream ms = new MemoryStream()) { using (PdfStamper stamper = new PdfStamper(reader, ms)) { } return ms.ToArray(); } } 遍历可用的所有网页,并更改每个网页字典的PdfReader(或/CropBox)条目。