0

我对PDFBox API感到沮丧。

我已经做好了:

PDDocument pdfDocument = PDDocument.load(new File("text.pdf"));
PDFTextStripper stripper = new PDFTextStripper();
String s =  stripper.getText(pdfDocument);
pdfDocument.close();

但我得到了一个

Exception in thread "main" java.lang.NullPointerException
at org.pdfbox.pdmodel.PDPageNode.getAllKids(PDPageNode.java:194)
at org.pdfbox.pdmodel.PDPageNode.getAllKids(PDPageNode.java:182)
at org.pdfbox.pdmodel.PDDocumentCatalog.getAllPages(PDDocumentCatalog.java:226)
at org.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:216)
at org.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:149)
at lucene.test.main(test.java:47)

String s =  stripper.getText(pdfDocument);

我完全不知道为什么。使用本教程创建 PDF 效果很好 ( http://pdfbox.apache.org/cookbook/textextraction.html )。但是这个文本提取没有。已经搜索了很多,但没有任何帮助。

顺便说一句,我仍然使用“ pdfbox-0.7.3.jar ”,因为新的“ pdfbox-1.8.2.jar ”对我不起作用。这可能是原因吗?

谢谢帮助。

PS:使用“stripper.writeText()”时我遇到了同样的错误

4

4 回答 4

2

代替

PDDocument pdfDocument = PDDocument.load(new File("text.pdf"));

只需使用

PDDocument pdfDocument = PDDocument.load("C:\TEMP\text.pdf");

我不知道为什么,但它现在对我有用。即使是旧的 0.7.3 PDFBox。

于 2019-10-17T10:01:35.170 回答
1

添加下面的外部罐子:

  1. pdfbox-1.3.1

  2. 公共日志记录-1.2

Java 代码:

import org.apache.pdfbox.multipdf.Splitter;   
import org.apache.pdfbox.pdmodel.PDDocument;  
import java.io.File;   
import java.io.IOException;   
import java.util.List;   
import java.util.Iterator;  

public class PdfSplitting {  

    public static void main(String[] args)throws IOException {  

          File file = new File("D:/test.pdf");  
          PDDocument document = PDDocument.load(file);   

          Splitter splitter = new Splitter();  

          List<PDDocument>Pages = splitter.split(document);  

          Iterator<PDDocument>iterator = Pages.listIterator();  

    int i = 1;  
    while(iterator.hasNext()) {  
             PDDocument pd = iterator.next();  
    pd.save("D:/test"+ i++ +".pdf");  
          }  
          System.out.println("Pdf spitted successfully");  
    document.close();  
    }  
}  
于 2019-04-16T07:46:06.730 回答
0

问题在于这条线

PDDocument pdfDocument = PDDocument.load(new File("text.pdf"));

指定text.pdf那里的路径,即连同路径。

在不知道文件所在位置的情况下,JVM 应该如何创建文件对象,这就是发生异常的原因。给那边的路,然后你就可以走了。

更新

这似乎是一个错误,并已在以后的版本中修复。

于 2013-10-13T14:22:14.633 回答
0

为此始终使用为此始终使用 pdfbox 1.8.6 和 fop0.93

PDDocument 文档 = 空;尝试 { doc = new PDDocument(); PDPage 页面 = 新 PDPage(); doc.addPage(page); PDPageContentStream contentStream = new PDPageContentStream(doc, page);

        PDFont pdfFont = PDType1Font.HELVETICA;
        float fontSize = 25;
        float leading = 1.5f * fontSize;

        PDRectangle mediabox = page.findMediaBox();
        float margin = 72;
        float width = mediabox.getWidth() - 2*margin;
        float startX = mediabox.getLowerLeftX() + margin;
        float startY = mediabox.getUpperRightY() - margin;

        String text = "Hello sir finally PDF is created : thanks"; 
        List<String> lines = new ArrayList<String>();
        int lastSpace = -1;
        while (text.length() > 0)
        {
            int spaceIndex = text.indexOf(' ', lastSpace + 1);
            if (spaceIndex < 0)
            {
                lines.add(text);
                text = "";
            }
            else
            {
                String subString = text.substring(0, spaceIndex);
                float size = fontSize * pdfFont.getStringWidth(subString) / 1000;
                if (size > width)
                {
                    if (lastSpace < 0) // So we have a word longer than the line... draw it anyways
                        lastSpace = spaceIndex;
                    subString = text.substring(0, lastSpace);
                    lines.add(subString);
                    text = text.substring(lastSpace).trim();
                    lastSpace = -1;
                }
                else
                {
                    lastSpace = spaceIndex;
                }
            }
        }

        contentStream.beginText();
        contentStream.setFont(pdfFont, fontSize);
        contentStream.moveTextPositionByAmount(startX, startY);            
        for (String line: lines)
        {
            contentStream.drawString(line);
            contentStream.moveTextPositionByAmount(0, -leading);
        }
        contentStream.endText(); 
        contentStream.close();

         doc.save("E:\\document.pdf");
    }catch (Exception exp){
        logger.error("[GetInformation] email id is " +exp);

    }
    finally
    {
        if (doc != null)
        {
            try{
            doc.close();
            }catch (Exception expe){
                logger.error("[GetInformation] email id is " +expe);

            }
        }
    }
于 2014-10-16T09:29:38.410 回答