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-1.8.2.jar」が機能しなかったため、「 pdfbox-0.7.3.jar 」を引き続き使用していますこれが理由でしょうか?

助けてくれてありがとう。

PS: "stripper.writeText()" を使用すると、同じエラーが発生します。

4

4 に答える 4

0

これには常に使用しますこれには常にpdfbox 1.8.6とfop0.93を使用します

PDDocument ドキュメント = null; { doc = new PDDocument(); を試してください。PDPage ページ = 新しい PDPage(); doc.addPage(ページ); 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 に答える
0

問題はこの行にあります

PDDocument pdfDocument = PDDocument.load(新しいファイル("text.pdf"));

そこにパスを指定しtext.pdfます。つまり、パスと一緒に指定します。

ファイルが存在する場所がわからない場合、JVM がファイル オブジェクトを作成する方法が想定されているため、例外が発生します。あそこに道を譲ってください。

アップデート

これはバグのようで、後のバージョンで修正されています。

于 2013-10-13T14:22:14.633 に答える