3

PDFファイルを一連の画像にエクスポートするように作成されたプログラムがあります。次のように表示されます。

 //Load pdf from path(file)
    File file = new File("C:\\TEMP\\office\\a.pdf");
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    byte[] b = new byte[(int) raf.length()];
    raf.readFully(b);
    ByteBuffer buf = ByteBuffer.wrap(b);
    PDFFile pdffile = new PDFFile(buf);



    //Get number of pages

    int numOfPages = pdffile.getNumPages();
    System.out.println(numOfPages);
    //iterate through the number of pages
    for (int i = 1; i <= numOfPages; i++) {
        PDFPage page = pdffile.getPage(i);
        //Create new image
        Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
        Image img = page.getImage(rect.width, rect.height, rect, null, true, true);
        BufferedImage bufferedImage = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);
        Graphics g = bufferedImage.createGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();

        File asd = new File("C:\\TEMP\\office\\img\\Testingx" + i + ".jpg");
        if (asd.exists()) {
            asd.delete();
        }
//Export the image to jpg format using the path C:\TEMP\office\img\filename
        ImageIO.write(bufferedImage, "jpg", asd);
    }
//Close the buf and other stuffs, which does not affect the image exported

このプログラムは多くの PDF ファイルで正常に動作しますが、インターネットで見つけたさまざまな pdf を使用してプログラムをテストしていたときに、他のファイルのように正確に画像にエクスポートできない pdf があり、使用したリソースを以下に示します。

元の PDF リンク: 2007_OReilly_EssentialActionScript3.0.pdf

上記のPDFの7ページを使用します。

エクスポートされるイメージ :期待される結果のイメージについては、ここをクリックしてください

プログラムが操作を終了した後、結果のイメージはまったく異なります。

結果画像はこちら

ご覧のとおり、結果の画像は上に移動し、コンテンツの一部が消え、結果の画像は pdf の書式設定が失われ、中央に配置されず、右にインデントされます。

PDFrenderer 自体には問題はありません。 PDFrenderer の .jar ファイルを実行すると、上部と書式が元の PDF ファイルと一致しています。

7 ページの PDFRenderer で開いた PDF

既知の問題: ImageIO は CMYK 形式をサポートしていないため、CMYK 形式を使用するページ 1 およびその他のページは正しくエクスポートできません。私が正しいかどうかはわかりません。

別の問題: PDFRenderer がページ 1 の読み取りに失敗したようです。これは、おそらく PDF の書式設定で使用されている何かが原因である可能性があります。私はそれについてあまり知りません

使用ライブラリ:PDFRenderer

前述のリンクから PDF をダウンロードし、私が提供したプログラムを使用して問題を再現できます。

私の質問: どうすればこの問題を解決できますか? 私のプログラムに何か問題がありますか?

4

1 に答える 1

1

私は自分で問題を見つけ、それを修正することができました。

解説は以下の通り

私のJAVAプログラムは、pdfファイルの「X」座標と「Y」座標に従っていません。簡単にするために、私のプログラムはX、Y座標をハードコーディングしました。ほとんどの場合、ほとんどの pdf は次の画像のように機能します。

ほとんどの PDF http://img266.imageshack.us/img266/7618/4cl5.png

ただし、私が提供した pdf はそうではありません。左上隅の X 座標は 0 ではないため、Y はそのため、画像が切り取られています。

要するに、私のプログラムは長方形の形で PDF 画面をキャプチャしますが、上記の PDF i は左上隅の座標を見つけられないため、下の画像のような画面をキャプチャします。Y座標は私のミスです。

例外 PDF http://img12.imageshack.us/img12/9672/plhb.png

プログラムを次のように変更すると、ほとんどの場合と同じように動作し、さらに改善されます。

Rectangle rect = new Rectangle((int)page.getPageBox().getX(), (int)page.getPageBox().getY(), (int) page.getBBox().getWidth(), (int) ページ。 getBBox().getHeight());

これにより、プログラムは PDFRenderer によって提供された PDF 全体を左上隅から「キャプチャ」できます。これは、最初に提供した画像と同じです。A4 から A7 までの異なるページ サイズでも同じように機能します。これ以上テストしませんでした。 、しかしそれは動作します

于 2013-09-27T14:01:48.473 に答える