2

I have a PDF with a CropBox size of 6" wide x 9" high. I need to add it to a standard letter-sized PDF. If I change the CropBox size, then the cropmarks become visible. So ideally what I'd like to do is crop out just the visible portion of the page, then pad the sides so that the total height and width is letter-sized.

Is this possible using PDFBox or another Java class?

4

3 に答える 3

2

あなたの問題に対する答えは見つかりましたか?私は今週、同じシナリオに直面しています。

ヘッダー、フッター、およびフォームを含む標準のレター サイズ (8.5" x 11") の PDF A があります。その PDF の生成を制御できないため、ヘッダーとフッターが少し汚れているため、それらを削除する必要があります。私の最初のアプローチは、フォームをボックス (どのタイプのボックスでも機能します) に抽出し、それを新しい PDF ページとしてエクスポートすることでした。問題は、私の新しい Box が特定のサイズ (たとえば 6" x 7") であり、ドキュメントを徹底的に調査した後、それを 8.5" x 11" の PDF B に埋め込む方法を見つけることができなかったことです。出力 PDF は、私の Box と同じサイズでした。すべてのシナリオで、適切なサイズの空白の PDF ファイルが生成されるか、フォームが含まれているがサイズが間違っている PDF が生成されます。

その後、別のアプローチを使用するしかありませんでした。あまりきれいではありませんが、PDF を操作するときは、ブラック マジックと回避策が主なトピックです。元の PDF A を残し、不要な部分をすべて消去しました。つまり、長方形を作成し、それらを白で塗りつぶし、隠したいセクションを覆いました。結果は、私のフォームのみを含む、適切な次元の PDF ファイルです。万歳!技術的には、ヘッダーとフッターはまだページに存在しており、実際にそれらを削除する方法はありませんでした。私はそれらを非表示にすることしかできませんでした (機密データを非表示にしない限り、これはエンド ユーザーに何の違いもありません)。

あなたの質問が 2 年前に送信されたことは承知していますが、私の質問に対する適切な回答をオンラインで見つけるのに非常に苦労しました。そのため、ここでコミュニティに恩返しをし、将来の開発者が時間を節約できるように支援できることを願っています。ボックスを抽出して標準サイズのページに埋め込む方法を実際に見つけた場合は、回答を投稿してください。

ちなみに私のコードは次のとおりです。

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;

import java.awt.Color;
import java.io.*;
import java.util.List;

// This code doesn't actually extract PDF elements per say
// It fills 2 rectangles in white to hide the header and the footer of our PDF page
public class ex {

    // Arbitrary values obtained in a very obscure way
    static int PAGE_WIDTH = 615;
    static int PAGE_HEIGHT = 815;

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException, COSVisitorException {

        File inputFile = new File("C:\\input.pdf");
        File outputFile = new File("C:\\output.pdf");

        PDDocument inputDoc = PDDocument.load(inputFile);
        PDDocument outputDoc = new PDDocument();

        List<PDPage> pages = inputDoc.getDocumentCatalog().getAllPages();

        PDPageContentStream pageCS = null;

        // Lets paint our pages white !
        for (PDPage page : pages) {
            pageCS = new PDPageContentStream(inputDoc, page, true, false);
            pageCS.setNonStrokingColor(Color.white);
            // Top rectangle
            pageCS.fillRect(0, 0, PAGE_WIDTH, 30);
            // Bottom rectangle
            pageCS.fillRect(0, PAGE_HEIGHT-30, PAGE_WIDTH, 30);
            pageCS.close();
            outputDoc.addPage(page);
        }

        // Save to file
        outputFile.delete();
        outputDoc.save(outputFile);

        // Wait until the end to close all documents, or else you get an error
        inputDoc.close();
        outputDoc.close();
    }
}
于 2015-10-02T14:57:41.710 に答える
1

私はジョンの答えを少し採用しました。多分これは誰かを助けるでしょう。

ループを変更して、必要な寸法で新しい長方形を作成しました。次に、長方形がページに設定され、その後新しいドキュメントに追加されます。このスニペットを使用して、スキャンした長いドキュメントから黒い境界線をトリミングしました。

これにより、ページのサイズが変更されることに注意してください。

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;


import java.io.File;
import java.io.IOException;
import java.util.List;

public class Main {


    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException, COSVisitorException {

        File inputFile = new File("/path/to/your/file");
        File outputFile = new File("/path/to/your/file");

        PDDocument inputDoc = PDDocument.load(inputFile);
        PDDocument outputDoc = new PDDocument();

        List<PDPage> pages = inputDoc.getDocumentCatalog().getAllPages();

        // Lets paint our pages white !
        for (PDPage page : pages) {
            PDRectangle rectangle=new PDRectangle();
            rectangle.setLowerLeftX(0);
            rectangle.setLowerLeftY(0);
            rectangle.setUpperRightX(500);
            rectangle.setUpperRightY(680);

            page.setMediaBox(rectangle);
            page.setCropBox(rectangle);
            outputDoc.addPage(page);
        }

        // Save to file
//        outputFile.delete();
        outputDoc.save(outputFile);

        // Wait until the end to close all documents, or else you get an error
        inputDoc.close();
        outputDoc.close();
    }
}
于 2016-04-28T18:18:23.063 に答える