Я использую 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 вопроса.
Поскольку это поведение связано с внутренними данными вашего PDF-документа, пожалуйста, поставьте его или, по крайней мере, выдержку, содержащую несколько ее страниц, достаточную для воспроизведения проблем. – mkl
Как загрузить файл PDF на мой пост? Я не вижу возможности сделать это. – vdeveloper
Stackoverflow, к сожалению, не позволяет загружать общие файлы, загружать только изображения. Обычно люди загружают свои большие данные примера в службу обмена файлами (например, общедоступные общие папки на Google Диске или Dropbox, не используйте службы обмена файлами, толкающие загрузчик в объявлениях) и публикуйте здесь URL. – mkl