Получение длины страницы PDF - PullRequest
0 голосов
/ 22 ноября 2018

В моих статьях, отформатированных в формате PDF, одна или несколько страниц могут быть пустыми, и я хочу обнаружить их и удалить из файла PDF.Если я могу определить страницы размером менее 60 КБ, я думаю, что смогу обнаружить пустые страницы.Потому что они, вероятно, пустые.

Я пытался так:

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 голосов
/ 27 ноября 2018

Я бы сделал это в 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);
}
...