11

画像/PDFをサムネイル形式で表示するWebアプリケーションを作成しています。それぞれの画像/ pdfをクリックすると、新しいウィンドウで開きます。

PDFの場合、私は持っています(これは新しいウィンドウのコードです)

<iframe src="images/testes.pdf" width="800" height="200" />

これを使用すると、Web ブラウザーですべての PDF を表示できます。ただし、サムネイルの目的で、PDFの最初のページのみを画像として表示したい。

私は試した

 <h:graphicImage value="images/testes.pdf" width="800" height="200" />

しかし、それは機能していません。これを行う方法はありますか?

更新 1

例としてpdfファイルのパスを提供しています。ただし、データベースに画像があります。実際には、以下のようなコードがあります。

<iframe src="#{PersonalInformationDataBean.myAttachmentString}" width="800" height="200" />

更新 2

サムネイルのために、私が使用しているのは

 <h:graphicImage height=200 width=200 value="...."> 

ただし、PDFでも同じことを達成する必要があります。

私が期待していることを明確に願っています...

4

3 に答える 3

7

埋め込み PDF ( 経由で実行) がすべてのブラウザで<h:graphicImage value="some.pdf" ... /> 同じようにうまく表示されるかどうかはわかりません。

最初のページを PDF として抽出する

どうしても PDF を使用する場合は、次の 2 つのコマンドライン ツールのいずれかを使用して、PDF の最初のページを抽出することをお勧めします。

  1. pdftk
  2. ゴーストスクリプト

どちらも Linux、Mac OS X、および Windows で利用できます。

pdftk コマンド

pdftk input.pdf cat 1 output page-1-of-input.pdf

Ghostscript コマンド

gs -o page-1-of-input.pdf -sDEVICE=pdfwrite -dPDFLastPage=1 input.pdf

(Windows ではgswin32c.exeorgswin64c.exeの代わりに使用しgsます。)

pdftkページの抽出に関しては、Ghostscript よりもわずかに高速ですが、単一のページの場合、その違いはおそらく無視できます。 最新のリリース バージョン v9.05 では、前の文は当てはまりません。Ghostscript (すべての起動オーバーヘッドを含む) では、756 ページの PDF 仕様から最初のページを抽出するのに約 1 秒かかるのに対し、PDFTK では約 11 秒かかることがわかりました。

1ページ目をJPEGに変換する

古いブラウザーでも最初のページを適切に表示できるようにしたい場合は、JPEG に変換します。Ghostscript はここであなたの味方です (ImageMagick は単独では実行できません。とにかく Ghostscript の助けが必要です):

gs -o page-1-of-input-PDF.jpeg -sDEVICE=jpeg -dLastPage=1 input.pdf

33 ページが必要な場合は、次のようにします。

gs -o page-33-of-input-PDF.jpeg -sDEVICE=jpeg -dFirstPage=33 -dLastPage33 input.pdf

17 ~ 23 ページのような一連の PDF が必要な場合は、次のようにしてください。

gs -o page-16+%03d-of-input-PDF.jpeg -sDEVICE=jpeg -dFirstPage=17 -dLastPage23 input.pdf

%03d表記は、処理されるページごとに 1 から増加することに注意してください。したがって、最初の JPEG の名前はpage-16+001-of-input-PDF.jpeg.

たぶんPNGの方がいいですか?

JPEG は、テキスト ページのように黒と白のコントラストが高く、エッジがシャープな画像には適していないことに注意してください。これにはPNGの方がはるかに優れています。

Ghostscript を使用して最初の PDF ページから PNG を作成するのは簡単です。

gs -o page-1-of-input-PDF.png -sDEVICE=pngalpha -dLastPage=1 input.pdf

ページの範囲を抽出する場合は、JPEG のようなアナログ オプションが当てはまります。

于 2012-08-06T18:47:11.503 に答える
1

これは私が使ったものです

Document document = new Document();
try {
    document.setFile(myProjectPath);
    System.out.println("Parsed successfully...");
} catch (PDFException ex) {
    System.out.println("Error parsing PDF document " + ex);
} catch (PDFSecurityException ex) {
    System.out.println("Error encryption not supported " + ex);
} catch (FileNotFoundException ex) {
    System.out.println("Error file not found " + ex);
} catch (IOException ex) {
    System.out.println("Error handling PDF document " + ex);
}



// save page caputres to file.
float scale = 1.0f;
float rotation = 0f;

System.out.println("scale == " + scale);

// Paint each pages content to an image and write the image to file
InputStream fis2 = null;
File file = null;
for (int i = 0; i < 1; i++) {
    BufferedImage image = (BufferedImage) document.getPageImage(i,
    GraphicsRenderingHints.SCREEN,
    Page.BOUNDARY_CROPBOX, rotation, scale);
    RenderedImage rendImage = image;
    // capture the page image to file
    try {
        System.out.println("\t capturing page " + i);
        file = new File(myProjectActualPath + "myImage.png");
        ImageIO.write(rendImage, "png", file);
        fis2 = new BufferedInputStream(new FileInputStream(myProjectActualPath + "myImage.png"));

    } catch (IOException ioe) {
        System.out.println("IOException :: " + ioe);
    } catch (Exception e) {
        System.out.println("Exception :: " + e);
    }
    image.flush();
}
于 2013-02-12T12:36:40.520 に答える
1

警告:必要でない限り、Ma9icのスクリプト(別の回答に投稿)を使用しないでください...

  • ...PDF から JPEG への変換に必要以上に多くの時間とリソースを消費させる
  • ...PDF から JPEG への変換プロセスを完全に制御できなくなります。

あなたにとってはうまくいくかもしれませんが、これらの 8 行の Bash には非常に多くの問題があります。

まず、入力 PDF からページ数を抽出するため
に使用します。identifyただし、identify(ImageMagick の一部) だけで PDF を完全に処理することはできません。PDF入力を処理するには、Ghostscriptを「デリゲート」として実行する必要があります。ImageMagick を介して間接的に実行する代わりに、Ghostscript を直接使用する方がはるかに効率的です。

次に、 PDF->JPEG 変換
に使用します。convert上記と同じ意見: とにかく Ghostscript を使用するので、直接実行してみませんか?

3 番目に
、ページをループしconvert、PDF のすべてのページに対して異なるプロセスを実行します。つまり、100 ページの PDF ファイルに対して 100 回の変換が行われます。つまり、100 個の Ghostscript コマンドを実行して 100 個の JPEG を生成します。

4 番目に、
Fahim Parkar さんの質問は、PDF のすべてではなく、最初のページからサムネイルを取得することでした。

このスクリプトは、100 ページの PDF に対して少なくとも 201 の異なるコマンドを実行しますが、すべてを 1 つのコマンドで実行できます。Ghostscript を直接実行すると...

  1. ...より高速かつ効率的に実行されるだけでなく、
  2. ...しかし、JPEG の品質設定をよりきめ細かく、より適切に制御することもできます。

仕事に適したツールを使用し、正しく使用してください!


アップデート:

尋ねられたので、Ma9ic のスクリプトの代替実装を以下に示します。

#!/ビン/バッシュ
infile=${1}

gs -q -o $(basename "${infile}")_p%04d.jpeg -sDEVICE=jpeg "${infile}"

# 幅 200 ピクセルのサムネイル JPEG を取得するには、次のコマンドを使用します。
# gs -q -o name_200px_p%04d.jpg -sDEVICE=jpeg -dPDFFitPage -g200x400 "${infile}"

# より高品質の JPEG (サイズの大きいものも含む) を取得するには、
# 300 dpi の解像度は、次のコマンドを使用します。
# gs -q -o name_300dpi_p%04d.jpg -sDEVICE=jpeg -dJPEGQ=100 -r300 "${infile}"

エコー「完了」

ベンチマークも実行しました。両方のスクリプトを使用して、756 ページの PDF-1.7 仕様を JPEG に変換しました。

  • Ma9ic のバージョンでは、756 個の JPEG を生成するのに 1413 秒かかります。
  • 私のバージョンはその時間の 93% を節約し、91 秒かかります。
  • さらに、Ma9ic のスクリプトは、私のシステムで大部分が黒の JPEG 画像を生成しますが、私のシステムは問題ありません。
于 2012-08-06T16:33:18.883 に答える