7


5

私はこれを行う方法の例を探してWebを精査しました。 私が必要としているよりももう少し複雑であるように思われるものをいくつか見つけました。 私の質問は、iTextSharpを使用して、あるPDF文書を別のPDF文書に追加するためのかなり簡潔な方法があるかどうかということです。

最適にはこれは3番目のファイルを含まないでしょう。 最初のPDFドキュメントを開き、2番目のPDFドキュメントを最初のPDFドキュメントに追加してから、両方を閉じます。

4 Answer


13


私は本当に何かが足りないかもしれませんが、もっと簡単なことをしました。 私はこの解決策がおそらくブックマークを更新しないことを認めています(これまでのところここでの最良の答えのように)、それは私のために完璧に動作します。 ドキュメントを入力可能フォームとマージしていたので、PdfCopyの代わりにPdfCopyFieldsを使用しました。

これがコードです(実際のコードを見やすくするためにすべてのエラー処理を省略しました。コードを使用する予定がある場合は、開いているリソースを閉じるためにtry..finallyを追加してください)。

void MergePdfStreams(List Source、Stream Dest){PdfCopyFields copy = new PdfCopyFields(Dest);

foreach(ソース内のストリームソース){PdfReader reader = new PdfReader(source); copy.AddDocument(reader); }

copy.Close(); }

FileStream、MemoryStreamなど、任意のストリームを渡すことができます(データベースからPDFを読み取るときに便利です。一時ファイルは不要など)。

使用例

void TestMergePdfStreams(){List sources = new List(){new FileStream( "template1.pdf"、FileMode.Open)、新しいFileStream( "template2.pdf"、FileMode.Open)、new MemoryStream((byte [])someDataRow ["PDF_COLUMN_NAME"])};

MergePdfStreams(sources、new FileStream( "MergedOutput.pdf"、FileMode.Create)); }


5


わかりました、それは単純明快ではないです、しかしそれははたらき、そして驚くほど速いです。 (そしてそれは3番目のファイルを使用します。開いたり追加したりするようなことはしません。)私はこれをdocs / examplesで発見しました。 これがコードです:

private void CombineMultiplePDFs(string [] fileNames、string outFile){int pageOffset = 0; ArrayList master = new ArrayList(); int f = 0。

ドキュメントdocument = null。 PdfCopyライター= null。 while(f <fileNames.Length){//特定のドキュメントのリーダーを作成しますPdfReader reader = new PdfReader(fileNames [f]); reader.ConsolidateNamedDestinations(); //ページの総数を取得しますint n = reader.NumberOfPages; ArrayList bookmarks = SimpleBookmark.GetBookmark(reader); if(bookmarks!= null){if(pageOffset!= 0){SimpleBookmark.ShiftPageNumbers(bookmarks、pageOffset、null); master.AddRange(ブックマーク); pageOffset = n;

if(f == 0){//ステップ1:文書オブジェクトdocumentの作成= new Document(reader.GetPageSizeWithRotation(1)); //ステップ2:ドキュメントをリッスンするライターを作成しますwriter = new PdfCopy(document、new FileStream(outFile、FileMode.Create)); //ステップ3:ドキュメントdocument.Open()を開きます。 //ステップ4:(int i = 0; i <n;)の内容を追加する
            ++i;
if(writer!= null){PdfImportedPage page = writer.GetImportedPage(reader、i); writer.AddPage(ページ); PRAcroForm form = reader.AcroForm; if(form!= null)


1


はい。 iTextフォーラムに投稿されたPdfManipulationというクラスを見ました。 そのクラスを使用すると3番目のファイルが必要になります。

クラスはもともとVB.Netにあります。 私はそれを vbforums.comの投稿からダウンロードしました。 しかし、どうやら、それはファイルのマージ機能を持っていないので、私はそのクラスのコードに基づいてそれを書いた。

これはiTextSharpのないマシンで書かれています。 これにはバグがあるかもしれません。 ページ番号が0ベースか1ベースかがわからない。 しかしそれを撃ってください。

public static void MergePdfFiles(IEnumerableファイル、文字列出力){iTextSharp.text.Document doc; iTextSharp.text.pdf.PdfCopy pdfCpy;

doc = new iTextSharp.text.Document(); pdfCpy = new iTextSharp.text.pdf.PdfCopy(doc、new System.IO.FileStream(output、System.IO.FileMode.Create)); doc.Open();

foreach(ファイル内の文字列ファイル){//リーダーを初期化するiTextSharp.text.pdf.PdfReaderリーダー= new iTextSharp.text.pdf.PdfReader(file); int pageCount = reader.NumberOfPages;

//ドキュメントのページサイズを設定します。doc.SetPageSize(reader.GetPageSizeWithRotation(1));

for(int pageNum = 1; pageNum <= pageCount; pageNum){iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader、pageNum); pdfCpy.AddPage(ページ); }

reader.Close(); }

doc.Close(); }


0


私はPDFファイルのためにそれをする方法を知りません、しかし追記のために、あなたは単にファイルを連結します。 pdf2psとps2pdfがインストールされていれば、以下がその仕事をします。

pdf2ps file1.pdf file1.ps pdf2ps file2.pdf file2.ps cat file1.ps file2.ps> combined.ps ps2pdf combined.ps combined.pdf

私はpdf2psやps2pdfのエキスパートではありません。 私はこれまでにps2pdfを使ったことがありますが、そうするとそれはテキストをテキストのままにします(結果として得られるpdfからテキストを選択してコピーすることはできます)。 上記の手順を実行すると(pdf→ ps、結合、ps→ pdf)、結果のpdfは画像のようになります。 理由はわからない。