2

PDFBox を使用して webapp からデータを抽出し、PDF に変換しています。各 PDF ページにヘッダーを描画するメソッドがあります。ただし、各ページに画像を追加すると、ドキュメントがメモリ不足になります。誰かが解決策についてアイデアを持っているかどうか疑問に思っていましたか? ここに私の drawHeader メソッドがあります:

public static void drawHeader(PDDocument doc, PDPage page, PDPageContentStream contentStream, int[] columnWidths, int pageNumber) throws IOException {

    contentStream.beginText();
    PDFont font = PDType1Font.HELVETICA_BOLD;
    contentStream.setFont(font, 24);
    contentStream.moveTextPositionByAmount(50, 750);
    contentStream.drawString("Producer License Report");
    contentStream.endText();

    contentStream.beginText();
    contentStream.moveTextPositionByAmount(550, 750); 

    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 8);
    contentStream.drawString("Page " + pageNumber);
    contentStream.endText();

    contentStream.drawLine(50, 740, 340, 740);
    contentStream.drawLine(16, 680, 595, 680);

    List<String> headerList = new LinkedList<String>();
    headerList.add("NPN");
    headerList.add("First Name");
    headerList.add("Last Name");
    headerList.add("Suffix");
    headerList.add("License State");
    headerList.add("Resident State");
    headerList.add("License Number");

    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 9);
    float textx = 15;
    float texty = 685;

    InputStream in = new FileInputStream(new File("logo.jpg"));
    PDJpeg img = new PDJpeg(doc, in);
    contentStream.drawImage(img, 375, 720);


    for (int i = 0; i < headerList.size(); i++) {
        String text = headerList.get(i);
        contentStream.beginText();
        contentStream.moveTextPositionByAmount(textx, texty);
        contentStream.drawString(text);
        contentStream.endText();
        textx += (columnWidths[i] * 6.5);
    }
}
4

2 に答える 2

4

解決策を見つけました!contentStream を開く前に、Image-Object を作成する必要があります。

例:

   /* Step 1: Prepare the document.
               */
             doc = new PDDocument();
             PDPage page = new PDPage();
             doc.addPage(page);

             /* Step 2: Prepare the image
              * PDJpeg is the class you use when dealing with jpg images.
              * You will need to mention the jpg file and the document to which it is to be added
              * Note that if you complete these steps after the creating the content stream the PDF
              * file created will show "Out of memory" error.
              */

             PDXObjectImage image = null;
             image = new PDJpeg(doc, new FileInputStream("image.jpg"));
             PDPageContentStream contentStream = new PDPageContentStream(doc,
                    page);
....
于 2012-08-24T12:10:49.080 に答える
0

ティモ・ホーエンの回答にコメントしようとしていますが、まだ十分な担当者がいません...

「メモリ不足」エラーで見つかったもう 1 つの問題は、画像が大きいか、ページから引き出そうとした場合です。

座標から始めて、100, 100そこから作業します。

例えばcontentStream.drawImage(img, 100, 100);

乾杯、

サム

于 2014-02-13T16:00:11.723 に答える