2015-09-08 2 views
0

Я использую itext-xtra-5.5.6 api для удаления/очистки верхнего и нижнего колонтитула.Проблема с удалением верхнего и нижнего колонтитула в PDF с использованием iText PDF

Вот код

//removes header and footer based on the configuration 
public static void cleanUpContent(String inPDFFile,String targetPDFFile,PDFConfig pdfConfig) throws Exception{ 
    PdfReader reader = new PdfReader(inPDFFile); 
    OutputStream outputStream = new FileOutputStream(targetPDFFile); 
    float upperY=pdfConfig.getPdfUpperY(); 
    float lowerY=pdfConfig.getPdfLowerY(); 
    boolean highLightColor=pdfConfig.isPdfHighLightClippedTextColor(); 
    PdfStamper stamper = new PdfStamper(reader, outputStream); 
    List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>(); 

    for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
     Rectangle pageRect = reader.getCropBox(i); 
     Rectangle headerRect= new Rectangle(pageRect); 
     headerRect.setBottom(headerRect.getTop()-upperY);    
     Rectangle footerRect= new Rectangle(pageRect); 
     footerRect.setTop(footerRect.getBottom()+lowerY); 

     if(highLightColor){ 
      cleanUpLocations.add(new PdfCleanUpLocation(i, headerRect,BaseColor.GREEN)); 
      cleanUpLocations.add(new PdfCleanUpLocation(i, footerRect,BaseColor.GREEN)); 
     }else{ 
      cleanUpLocations.add(new PdfCleanUpLocation(i, headerRect)); 
      cleanUpLocations.add(new PdfCleanUpLocation(i, footerRect)); 
     } 
    } 
    PdfCleanUpProcessor cleaner = new PdfCleanUpProcessor(cleanUpLocations, stamper); 
    try{ 
     cleaner.cleanUp(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

    stamper.close(); 
    reader.close(); 
    outputStream.flush(); 
    outputStream.close(); 
} 

Когда я запускаю код, чтобы удалить верхние и нижние колонтитулы для файла PDF с 1440 страниц с upperY = 65 и Лоурьте = 65, то код удаляет все содержимое из но когда upperY = 65 и lowerY = 45, тогда код удаляет только верхний и нижний колонтитулы, которые ожидаются.

Также другая проблема Null исключение указателя для некоторых страниц в классе DefaultClipper

private void fixupFirstLefts2(OutRec OldOutRec, OutRec NewOutRec) { 
    for (final OutRec outRec : polyOuts) { 
     if (outRec.firstLeft.equals(OldOutRec)) { 
      outRec.firstLeft = NewOutRec; 
     } 
    } 
} 

в polyOuts -> outRec.firstLeft равно нулю, так метод outRec.firstLeft.equals кидает исключения нулевого указателя.

стека исключений трассировки

java.lang.NullPointerException 
    at com.itextpdf.text.pdf.parser.clipper.DefaultClipper.fixupFirstLefts2(DefaultClipper.java:1463) 
    at com.itextpdf.text.pdf.parser.clipper.DefaultClipper.joinCommonEdges(DefaultClipper.java:2121) 
    at com.itextpdf.text.pdf.parser.clipper.DefaultClipper.executeInternal(DefaultClipper.java:1420) 
    at com.itextpdf.text.pdf.parser.clipper.DefaultClipper.execute(DefaultClipper.java:1362) 
    at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter.filterFillPath(PdfCleanUpRegionFilter.java:174) 
    at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRenderListener.filterCurrentPath(PdfCleanUpRenderListener.java:402) 
    at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRenderListener.renderPath(PdfCleanUpRenderListener.java:232) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.paintPath(PdfContentStreamProcessor.java:377) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.access$6300(PdfContentStreamProcessor.java:60) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor$PaintPath.invoke(PdfContentStreamProcessor.java:1183) 
    at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpContentOperator.invoke(PdfCleanUpContentOperator.java:138) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(PdfContentStreamProcessor.java:286) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.processContent(PdfContentStreamProcessor.java:429) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor$FormXObjectDoHandler.handleXObject(PdfContentStreamProcessor.java:1252) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.displayXObject(PdfContentStreamProcessor.java:352) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.access$6100(PdfContentStreamProcessor.java:60) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor$Do.invoke(PdfContentStreamProcessor.java:988) 
    at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpContentOperator.invoke(PdfCleanUpContentOperator.java:138) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(PdfContentStreamProcessor.java:286) 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.processContent(PdfContentStreamProcessor.java:429) 
    at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpProcessor.cleanUpPage(PdfCleanUpProcessor.java:160) 
    at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpProcessor.cleanUp(PdfCleanUpProcessor.java:135) 

не уверен, где я делаю ошибку. Я даже пытался посмотреть, содержат ли страницы PDF изображения или другие типы, но страницы просто основаны на тексте. Пожалуйста, помогите решить 2 вопроса.

+0

Поскольку это поведение связано с внутренними данными вашего PDF-документа, пожалуйста, поставьте его или, по крайней мере, выдержку, содержащую несколько ее страниц, достаточную для воспроизведения проблем. – mkl

+0

Как загрузить файл PDF на мой пост? Я не вижу возможности сделать это. – vdeveloper

+0

Stackoverflow, к сожалению, не позволяет загружать общие файлы, загружать только изображения. Обычно люди загружают свои большие данные примера в службу обмена файлами (например, общедоступные общие папки на Google Диске или Dropbox, не используйте службы обмена файлами, толкающие загрузчик в объявлениях) и публикуйте здесь URL. – mkl

ответ

1

В отношении наблюдений OP исключение, подобное представленному OP, действительно бросается при запуске кода OP с его образцовым файлом и iText и iText-xtra 5.5.6. Кроме того, страница, в которой это происходит, пуста в результате PDF.

Причиной исключения является некоторая ошибка, и причиной для пустой страницы является то, что код очистки для каждой обрабатываемой страницы сначала удаляет прежний контент, а затем начинает сбор нового содержимого; если исключение происходит на ранних этапах обработки страницы, как в случае с операцией, результатом может быть пустая страница.

Тем временем, хотя ошибка была исправлена ​​, в текущем моментальном снимке разработки 5.5.7 исключение больше не встречается.


Другой нежелательный эффект происходит, хотя: пример документ ОП содержит некоторые повернуты страницы, например, страница 18:

page 18 from source document

Применение кода как к нему, один получает:

page 18 processed by the original code

Причина этого заключается в том, что PdfStamper обычно пытается лечить повернутые портретные страницы, как если бы они были истинными пейзажными страницами.Как PdfCleanUpProcessor пытается этим вращение, не знает, это приводит к беспределу

Можно сказать, это не делать, хотя, используя setRotateContents сеттера:

... 
    PdfStamper stamper = new PdfStamper(reader, outputStream); 
    stamper.setRotateContents(false); 
    List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>(); 
    ... 

Этого обновленный код в настоящее время производит:

page 18 processed by the updated code

Смежные вопросы