删除PDF iTextSharp上的外部打印标记

时间:2013-07-26 14:43:53

标签: c# .net pdf itextsharp itext

我有一个带有封面的pdf文件,如下所示: uncropped pdf file

现在,我需要移除封面边缘的所谓“厨房标记”。我正在使用带有C#的iTextSharp,我需要使用iTextSharp创建一个只包含预期封面的新文档或使用PdfStamper删除它。或使用iTextSharp提供结果的任何其他解决方案。

到目前为止,我一直无法在搜索中找到任何好的代码示例。

1 个答案:

答案 0 :(得分:2)

你真的要删除它们还是只能将它们裁掉?如果您可以将它们裁剪掉,那么下面的代码就可以了。如果你必须从文件中删除它们,那么据我所知,没有一种简单的方法可以做到这一点。据我所知,这些对象没有明确标记为元对象。我能想到删除它们的唯一方法是检查所有内容,看它是否适合文档的活动区域。

下面是示例代码,它读取输入文件中的每个页面,并找到可能存在的各种框,trimartbleed。 (见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
        }
    }
}