获取 PDF 页面长度

Posted

技术标签:

【中文标题】获取 PDF 页面长度【英文标题】:Getting PDF page length 【发布时间】:2019-04-25 10:32:04 【问题描述】:

在我的 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(???);
     */

【问题讨论】:

splitting the PDF into multiple PDFs, one for each page然后测量它们各自的尺寸怎么样? @uweKeim,我不想逐页拆分 PDF 文件。因为想想如果我一页一页地拆分故事书会对我有用。在逐页拆分页面并删除空白页面后重新组装页面听起来不专业。 【参考方案1】:

我会分两步完成:

首先使用 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);

【讨论】:

以上是关于获取 PDF 页面长度的主要内容,如果未能解决你的问题,请参考以下文章

获取本地PDF页面高度 - iOS

如何获取PDF页面的出血盒大小?

如何使用 Python 获取 PDF 文件元数据“页面大小”?

如何获取PDF格式的逗号分隔页面列表?

Power Query - 当文件具有不同页面时从 PDF 中获取数据

我可以使用PDF :: API2获取页面大小和页面方向吗?