0

在我格式化 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(???);
     */
}
4

1 回答 1

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);
}
于 2018-11-27T12:36:24.200 回答