gpt4 book ai didi

java - 使用 iText PDF 删除 PDF 中的页眉和页脚时出现问题

转载 作者:行者123 更新时间:2023-12-01 11:10:22 26 4
gpt4 key购买 nike

我正在使用 itext-xtra-5.5.6 api 删除/清理页眉和页脚。

这是代码

//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();
}

当我运行代码来删除具有 1440 页且 upperY=65 和 lowerY=65 的 PDF 文件的页眉和页脚时,代码将从页面中删除所有内容,但当 upperY=65 和 lowerY=45 时,则代码仅删除预期的页眉和页脚。

另一个问题是 DefaultClipper 类中某些页面的空指针异常

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

在polyOuts -> outRec.firstLeft 为null 时,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 个问题。

最佳答案

关于 OP 的观察结果,当使用示例文件和 iText 和 iText-xtra 5.5.6 运行 OP 的代码时,确实会抛出像 OP 所呈现的异常一样的异常。此外,发生这种情况的页面在结果 PDF 中是空的。

异常的原因确实是一些bug,空页的原因是每个处理过的页面的清理代码首先删除以前的内容,然后开始构建新的内容;如果在处理页面时早期发生异常(如本例所示),则结果可能是一个空页面。

与此同时,该错误已得到修复,在当前的 5.5.7 开发快照中,该异常不再发生。

<小时/>但是,

出现了不同的不良效果:OP的示例文档包含一些旋转的页面,例如第 18 页:

page 18 from source document

按原样应用代码,得到:

page 18 processed by the original code

这样做的原因是 PdfStamper 通常尝试将旋转的纵向页面视为真正的横向页面。由于 PdfCleanUpProcessor 尝试不知道旋转,因此结果造成困惑

不过,可以使用 setRotateContents setter 告诉它不要这样做:

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

此更新的代码现在生成:

page 18 processed by the updated code

关于java - 使用 iText PDF 删除 PDF 中的页眉和页脚时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32448118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com