我正在尝试使用以下代码更改现有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();
我无法设置媒体框。它总是以相同的价值回归。我缺少什么?
答案 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
)条目。