iTextSharpを使用して改ページを除く複数のPDFファイルを組み合わせるにはどうすればよいですか?

アロザダ

誰かがiTextSharpでこれを行ったのではないかと思いますが、複数のPDFファイルを1つに結合したいのですが、改ページは残しておきます。たとえば、それぞれ3行のテキストを含む4つのPDFファイルを作成したいので、結果のファイルに1ページに12行すべてを含める必要があります。これは可能ですか?

mkl

OPもこの質問に[iText]のタグを付けており、私は.NetよりもJavaに慣れているので、ここでiText / Javaの回答を示します。iTextSharp / C#に簡単に翻訳できるはずです。

元の質問

複数のPDFファイルを1つに結合したいのですが、改ページは残しておきます。たとえば、それぞれ3行のテキストを含む4つのPDFファイルを作成したいので、結果のファイルに1ページに12行すべてを含める必要があります。

その例に示されているPDFファイルの場合、次の単純なユーティリティクラスを使用できます。

public class PdfDenseMergeTool
{
    public PdfDenseMergeTool(Rectangle size, float top, float bottom, float gap)
    {
        this.pageSize = size;
        this.topMargin = top;
        this.bottomMargin = bottom;
        this.gap = gap;
    }

    public void merge(OutputStream outputStream, Iterable<PdfReader> inputs) throws DocumentException, IOException
    {
        try
        {
            openDocument(outputStream);
            for (PdfReader reader: inputs)
            {
                merge(reader);
            }
        }
        finally
        {
            closeDocument();
        }

    }

    void openDocument(OutputStream outputStream) throws DocumentException
    {
        final Document document = new Document(pageSize, 36, 36, topMargin, bottomMargin);
        final PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();
        this.document = document;
        this.writer = writer;
        newPage();
    }

    void closeDocument()
    {
        try
        {
            document.close();
        }
        finally
        {
            this.document = null;
            this.writer = null;
            this.yPosition = 0;
        }
    }

    void newPage()
    {
        document.newPage();
        yPosition = pageSize.getTop(topMargin);
    }

    void merge(PdfReader reader) throws IOException
    {
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        for (int page = 1; page <= reader.getNumberOfPages(); page++)
        {
            merge(reader, parser, page);
        }
    }

    void merge(PdfReader reader, PdfReaderContentParser parser, int page) throws IOException
    {
        TextMarginFinder finder = parser.processContent(page, new TextMarginFinder());
        Rectangle pageSizeToImport = reader.getPageSize(page);
        float heightToImport = finder.getHeight();
        float maxHeight = pageSize.getHeight() - topMargin - bottomMargin;
        if (heightToImport > maxHeight)
        {
            throw new IllegalArgumentException(String.format("Page %s content too large; height: %s, limit: %s.", page, heightToImport, maxHeight));
        }

        if (heightToImport > yPosition - pageSize.getBottom(bottomMargin))
        {
            newPage();
        }
        else if (!writer.isPageEmpty())
        {
            heightToImport += gap;
        }
        yPosition -= heightToImport;

        PdfImportedPage importedPage = writer.getImportedPage(reader, page);
        writer.getDirectContent().addTemplate(importedPage, 0, yPosition - (finder.getLly() - pageSizeToImport.getBottom()));
    }

    Document document = null;
    PdfWriter writer = null;
    float yPosition = 0; 

    final Rectangle pageSize;
    final float topMargin;
    final float bottomMargin;
    final float gap;
}

PdfReaderインスタンスのリストがある場合はinputs、次のようにそれらをOutputStream output:にマージできます

PdfDenseMergeTool tool = new PdfDenseMergeTool(PageSize.A4, 18, 18, 5);
tool.merge(output, inputs);

これにより、A4ページサイズ、それぞれ18/72 "の上下の余白、および5/72"の異なるPDFページのコンテンツ間のギャップを使用してマージされたドキュメントが作成されます。

コメント

iText TextMarginFinderPdfDenseMergeTool上記で使用)はテキストのみを考慮します。他のコンテンツタイプも考慮する必要がある場合は、このクラスをいくらか拡張する必要があります。

各PDFには、おそらく表や画像など、数行しかありませんが、最終結果を1ページにしたいと思います。

テーブルにテキストコンテンツの上または下に達する装飾(線や色付きの背景など)が含まれている場合は、より大きなギャップ値を使用する必要があります。残念ながら、によって使用される解析フレームワークは、TextMarginFinderベクターグラフィックスコマンドをファインダーに転送しません。

画像がビットマップ画像の場合は、画像領域も考慮に入れるメソッドをTextMarginFinder実装して拡張する必要がrenderImageあります。

また、一部のPDFにはフィールドが含まれている場合があるため、結果の結合されたPDFにもそれらのフィールドを保持したいと思います。

AcroFormフィールドも考慮する必要がある場合は、次のことを行う必要があります。

  1. で表される長方形を拡張してTextMarginFinder、ウィジェット注釈の視覚化長方形も含めます。
  2. PdfDenseMergeTool.merge(PdfReader, PdfReaderContentParser, int)メソッドを拡張して、これらのウィジェットの注釈もコピーします。

更新

私は上に書いた

残念ながら、によって使用される解析フレームワークは、TextMarginFinderベクターグラフィックスコマンドをファインダーに転送しません。

一方(バージョン5.5.6)、その解析フレームワークは、ベクターグラフィックスコマンドも転送するように拡張されました。

ラインを交換する場合

TextMarginFinder finder = parser.processContent(page, new TextMarginFinder());

沿って

MarginFinder finder = parser.processContent(page, new MarginFinder());

この回答の下部に示されているMarginFinderクラスを使用すると、テキストだけでなく、すべてのコンテンツが考慮されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のテキストファイルを組み合わせて、重複を効果的に削除するにはどうすればよいですか?

分類Dev

ファイル履歴を壊さずに複数のGitリポジトリを組み合わせるにはどうすればよいですか?

分類Dev

iPython:Pandasを使用して、複数のテキストファイルを組み合わせて繰り返し使用するユーザー名を見つけるにはどうすればよいですか?

分類Dev

bashまたは正規表現を使用して、複数の文字と数字の組み合わせとサイズで複数のファイルの名前を変更するにはどうすればよいですか?

分類Dev

grepを使用してファイルで文字列の組み合わせを検索するにはどうすればよいですか?

分類Dev

複数のPDFを組み合わせて、各PDFの最初のページのページ番号が奇数になるようにするにはどうすればよいですか?

分類Dev

PDFドキュメントのページごとに1つのPNGファイルを使用して、複数ページのPDFファイルをPNGファイルに変換するにはどうすればよいですか?

分類Dev

Laravelと複数のテーブルを組み合わせるにはどうすればよいですか?

分類Dev

rubyで複数ページのpdfファイルを複数のpdfファイルに分割するにはどうすればよいですか

分類Dev

2つのファイルを組み合わせるにはどうすればよいですか

分類Dev

複数のOpenAPI3仕様ファイルを組み合わせるにはどうすればよいですか?

分類Dev

30個のcsvファイル(それぞれ1つの質問)から複数の選択肢の質問のスコアを取得し、それらを組み合わせて学生のグループにするにはどうすればよいですか?(Rを使用)

分類Dev

sedを使用してファイルリストを組み合わせるにはどうすればよいですか?

分類Dev

iTextSharpでページに合わせるをズームしてページで別のPDFを開くアクションを作成するにはどうすればよいですか?

分類Dev

Juliaを使用して、複数のCSVを読み取り、列を組み合わせるにはどうすればよいですか

分類Dev

「1ページのすべての列に合わせる」設定のファイルを設定するにはどうすればよいですか

分類Dev

複数のフィルターを組み合わせて、jQueryを使用してタスク行をフィルター処理するにはどうすればよいですか?

分類Dev

複数のフィールドの組み合わせでグループバンドを追加するにはどうすればよいですか?

分類Dev

複数の文字列ベクトルを組み合わせてRでデータ構造を作成するにはどうすればよいですか?

分類Dev

Pythonでデータを上書きせずに2つのファイルを組み合わせるにはどうすればよいですか?

分類Dev

csvファイルを組み合わせてPythonでヘッダー行を追加するにはどうすればよいですか?

分類Dev

node.jsを使用して複数のMongodbクエリを1つに組み合わせるにはどうすればよいですか?

分類Dev

T-SQLを使用して、長さが異なる複数の親子関係を組み合わせるにはどうすればよいですか?

分類Dev

画像とプロファイルのプロットを組み合わせてMatplotlibの図を作成するにはどうすればよいですか?

分類Dev

2つのCSVファイルを組み合わせて特定の値をプロットするにはどうすればよいですか?

分類Dev

別のテーブル(Django)でフィールドの組み合わせを正しく適用するにはどうすればよいですか?

分類Dev

Tableau Desktop-複数の計算フィールドを1つに組み合わせて、フィルターとして使用するにはどうすればよいですか?

分類Dev

PLPGSQLでWITHをFORループと組み合わせて使用するにはどうすればよいですか?

分類Dev

gtrendsRを取得して、90日間の複数のトレンドデータを組み合わせるにはどうすればよいですか?

Related 関連記事

  1. 1

    複数のテキストファイルを組み合わせて、重複を効果的に削除するにはどうすればよいですか?

  2. 2

    ファイル履歴を壊さずに複数のGitリポジトリを組み合わせるにはどうすればよいですか?

  3. 3

    iPython:Pandasを使用して、複数のテキストファイルを組み合わせて繰り返し使用するユーザー名を見つけるにはどうすればよいですか?

  4. 4

    bashまたは正規表現を使用して、複数の文字と数字の組み合わせとサイズで複数のファイルの名前を変更するにはどうすればよいですか?

  5. 5

    grepを使用してファイルで文字列の組み合わせを検索するにはどうすればよいですか?

  6. 6

    複数のPDFを組み合わせて、各PDFの最初のページのページ番号が奇数になるようにするにはどうすればよいですか?

  7. 7

    PDFドキュメントのページごとに1つのPNGファイルを使用して、複数ページのPDFファイルをPNGファイルに変換するにはどうすればよいですか?

  8. 8

    Laravelと複数のテーブルを組み合わせるにはどうすればよいですか?

  9. 9

    rubyで複数ページのpdfファイルを複数のpdfファイルに分割するにはどうすればよいですか

  10. 10

    2つのファイルを組み合わせるにはどうすればよいですか

  11. 11

    複数のOpenAPI3仕様ファイルを組み合わせるにはどうすればよいですか?

  12. 12

    30個のcsvファイル(それぞれ1つの質問)から複数の選択肢の質問のスコアを取得し、それらを組み合わせて学生のグループにするにはどうすればよいですか?(Rを使用)

  13. 13

    sedを使用してファイルリストを組み合わせるにはどうすればよいですか?

  14. 14

    iTextSharpでページに合わせるをズームしてページで別のPDFを開くアクションを作成するにはどうすればよいですか?

  15. 15

    Juliaを使用して、複数のCSVを読み取り、列を組み合わせるにはどうすればよいですか

  16. 16

    「1ページのすべての列に合わせる」設定のファイルを設定するにはどうすればよいですか

  17. 17

    複数のフィルターを組み合わせて、jQueryを使用してタスク行をフィルター処理するにはどうすればよいですか?

  18. 18

    複数のフィールドの組み合わせでグループバンドを追加するにはどうすればよいですか?

  19. 19

    複数の文字列ベクトルを組み合わせてRでデータ構造を作成するにはどうすればよいですか?

  20. 20

    Pythonでデータを上書きせずに2つのファイルを組み合わせるにはどうすればよいですか?

  21. 21

    csvファイルを組み合わせてPythonでヘッダー行を追加するにはどうすればよいですか?

  22. 22

    node.jsを使用して複数のMongodbクエリを1つに組み合わせるにはどうすればよいですか?

  23. 23

    T-SQLを使用して、長さが異なる複数の親子関係を組み合わせるにはどうすればよいですか?

  24. 24

    画像とプロファイルのプロットを組み合わせてMatplotlibの図を作成するにはどうすればよいですか?

  25. 25

    2つのCSVファイルを組み合わせて特定の値をプロットするにはどうすればよいですか?

  26. 26

    別のテーブル(Django)でフィールドの組み合わせを正しく適用するにはどうすればよいですか?

  27. 27

    Tableau Desktop-複数の計算フィールドを1つに組み合わせて、フィルターとして使用するにはどうすればよいですか?

  28. 28

    PLPGSQLでWITHをFORループと組み合わせて使用するにはどうすればよいですか?

  29. 29

    gtrendsRを取得して、90日間の複数のトレンドデータを組み合わせるにはどうすればよいですか?

ホットタグ

アーカイブ