1

現在、iText 2.1.7 を使用して、要件に合わせて PDF を「フォーマット」するアプリを作成中です。

基本的に、縦長の PDF を取得し、ページを縮小して、元の PDF の 2 ページが新しい PDF の横長の 1 ページに収まるようにします。また、後処理に使用するページの下部にスペースを残しています。

このプロセスは、90% の確率で正常に機能します。

しかし、コンテンツ部門によってトリミング/トリミングされた PDF を受け取りました。この PDF を Acrobat で表示すると、期待どおりに見えます。ただし、処理すると、新しい PDF には元の MediaBox 全体とトリミング ラインが含まれます。

ここに使用するコードと、問題の出力がどのように見えるかを示します。

File tempFile = new File(tempFilename);
PdfReader reader = new PdfReader(originalPdfFile);
Document doc = new Document(new RectangleReadOnly(842f, 595f), 0, 0, 0, 0);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(tempFile));
doc.open();
for (int i = 1; i < reader.getNumberOfPages(); i = i + 2) {
    doc.newPage();
    PdfContentByte cb = writer.getDirectContent();
    PdfImportedPage page = writer.getImportedPage(reader, i); // page #1

    float documentWidth = doc.getPageSize().getWidth() / 2;
    float documentHeight = doc.getPageSize().getHeight() - 65f;

    float pageWidth = page.getWidth();
    float pageHeight = page.getHeight();

    float widthScale = documentWidth / pageWidth;
    float heightScale = documentHeight / pageHeight;
    float scale = Math.min(widthScale, heightScale);

    float offsetX = (documentWidth - (pageWidth * scale)) / 2;
    float offsetY = 65f; //100f

    cb.addTemplate(page, scale, 0, 0, scale, offsetX, offsetY);

    PdfImportedPage page2 = writer.getImportedPage(reader, i+1); // page #2

    pageWidth = page.getWidth();
    pageHeight = page.getHeight();

    widthScale = documentWidth / pageWidth;
    heightScale = documentHeight / pageHeight;
    scale = Math.min(widthScale, heightScale);

    offsetX = ((documentWidth - (pageWidth * scale)) / 2) + documentWidth;
    offsetY = 65f; //100f

    cb.addTemplate(page2, scale, 0, 0, scale, offsetX, offsetY);//430f
    }

doc.close();

オリジナルのアクロバット:

ここに画像の説明を入力

acrobat で変更し、不要なプリトリム コンテンツを表示:

ここに画像の説明を入力

4

3 に答える 3

3

PDF 自体を確認しないと確認するのは困難ですが、問題は、この PDF のCropBox少なくとも一部のページで が指定されていることにあると思われます。page.setBoundingBox(reader.getCropBox(i));その場合は、ページ参照を取得した直後に次の ようにするとよいと思います。

a page's のデフォルト値CropBoxは it'sMediaBoxであるため、上記の行を追加しても、a を指定しない PDF ページのレイアウトに悪影響を与えるべきではないことに注意してくださいCropBox

(私は iText ユーザーではないので、これは私の推測ですが...)

幸運を!

于 2013-10-25T05:14:15.053 に答える
1

Kabals の回答に対するマイナーだが重要な修正が 1 つあります。ボックスは、座標ではなく幅/高さを想定しています。

            ...
            cropArray.add(new PdfNumber(cropbox.getLeft()));
            cropArray.add(new PdfNumber(cropbox.getBottom()));
            cropArray.add(new PdfNumber(cropbox.getWidth()));
            cropArray.add(new PdfNumber(cropbox.getHeight()));
            ...
于 2014-10-29T10:41:01.940 に答える