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 ファイルと一致しています。
既知の問題: ImageIO は CMYK 形式をサポートしていないため、CMYK 形式を使用するページ 1 およびその他のページは正しくエクスポートできません。私が正しいかどうかはわかりません。
別の問題: PDFRenderer がページ 1 の読み取りに失敗したようです。これは、おそらく PDF の書式設定で使用されている何かが原因である可能性があります。私はそれについてあまり知りません
使用ライブラリ:PDFRenderer
前述のリンクから PDF をダウンロードし、私が提供したプログラムを使用して問題を再現できます。
私の質問: どうすればこの問題を解決できますか? 私のプログラムに何か問題がありますか?