获取PDF页面长度

时间:2018-11-22 17:46:51

标签: c# itext page-size

在格式化PDF的文章中,一页或多页可能空白,我想检测它们并将其从PDF文件中删除。如果我可以识别出小于60 KB的页面,则认为可以检测到空白页面。因为它们可能是空的。

我尝试过这样:

var reader = new PdfReader("D:\\_test\\file.pdf");
/*
 * With reader.FileLength, I can get whole pdf file size.
 * But I dont know, how can I get pages'sizes...
 */
for (var i = 1; i <= reader.NumberOfPages; i++)
{
    /*
     * MessageBox.Show(???);
     */
}

1 个答案:

答案 0 :(得分:2)

我将分两个步骤进行操作:

  • 首先使用IEventListener浏览文档,以检测哪些页面为空
  • 确定哪些页面为空后,只需将源文档中的非空页面复制到新文档中,即可创建新文档

第1步:

List<Integer> emptyPages = new ArrayList<>();
PdfDocument pdfDocument = new PdfDocument(new PdfReader(new File(SRC)));
for(int i=1;i<pdfDocument.getNumberOfPages();i++){
    IsEmptyEventListener l = new IsEmptyEventListener();
    new PdfCanvasProcessor(l).processPageContent(pdfDocument.getPage(i));
    if(l.isEmptyPage()){
        emptyPages.add(i);
    } 
}

然后,您需要正确实现IsEmptyEventListener。这可能很棘手,具体取决于您的特定文档。这是一个演示。

class IsEmptyEventListener implements IEventListener {
    private int eventCount = 0;
    public void eventOccurred(IEventData data, EventType type){
        // perhaps count only text rendering events?
        eventCount++;
    }
    public boolean isEmptyPage(){ return eventCount < 32; }
}

第2步:

基于此示例:https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-reordering-pages

void copyNonBlankPages(List<Integer> blankPages, PdfDocument src, PdfDocument dst){
    int N = src.getNumberOfPages();
    List<Integer> toCopy = new ArrayList<>();
    for(int i=1;i<N;i++){
        if(!blankPages.contains(i)){
            toCopy.add(i);
        }
    }
    src.copyPagesTo(toCopy, dst);
}