我有一个带有封面的pdf文件,如下所示:
现在,我需要移除封面边缘的所谓“厨房标记”。我正在使用带有C#的iTextSharp,我需要使用iTextSharp创建一个只包含预期封面的新文档或使用PdfStamper删除它。或使用iTextSharp提供结果的任何其他解决方案。
到目前为止,我一直无法在搜索中找到任何好的代码示例。
答案 0 :(得分:2)
你真的要删除它们还是只能将它们裁掉?如果您可以将它们裁剪掉,那么下面的代码就可以了。如果你必须从文件中删除它们,那么据我所知,没有一种简单的方法可以做到这一点。据我所知,这些对象没有明确标记为元对象。我能想到删除它们的唯一方法是检查所有内容,看它是否适合文档的活动区域。
下面是示例代码,它读取输入文件中的每个页面,并找到可能存在的各种框,trim
,art
和bleed
。 (见this page。)
只要找到至少一个,就会将页面的裁剪框设置为列表中的第一个项目。在您的情况下,您可能实际上必须执行一些逻辑来查找所有这些项目中的“最小”,或者您可能只知道“艺术”将始终适合您。请参阅代码以获取其他注释。这针对iTextSharp 5.4.0.0。
//Sample input file
var inputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Binder1.pdf");
//Sample output file
var outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Cropped.pdf");
//Bind a reader to our input file
using (var r = new PdfReader(inputFile)) {
//Get the number of pages
var pageCount = r.NumberOfPages;
//See this for a list: http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfReader.html#getBoxSize(int, java.lang.String)
var boxNames = new string[] { "trim", "art", "bleed" };
//We'll create a list of all possible boxes to pick from later
List<iTextSharp.text.Rectangle> boxes;
//Loop through each page
for (var i = 1; i <= pageCount; i++) {
//Initialize our list for this page
boxes = new List<iTextSharp.text.Rectangle>();
//Loop through the list of known boxes
for (var j = 0; j < boxNames.Length; j++) {
//If the box exists
if(r.GetBoxSize(i, boxNames[j]) != null){
//Add it to our collection
boxes.Add(r.GetBoxSize(i, boxNames[j]));
}
}
//If we found at least one box
if (boxes.Count > 0) {
//Get the page's entire dictionary
var dict = r.GetPageN(i);
//At this point we might want to apply some logic to find the "inner most" box if our trim/bleed/art aren't all the same
//I'm just hard-coding the first item in the list for demonstration purposes
//Set the page's crop box to the specified box
dict.Put(PdfName.CROPBOX, new PdfRectangle(boxes[0]));
}
}
//Create our output file
using (var fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
//Bind a stamper to our reader and output file
using(var stamper = new PdfStamper(r,fs)){
//We did all of our PDF manipulation above so we don't actually have to do anything here
}
}
}