1

PDF ファイルの複数のページを並べ替えようとしています。ブログでいくつかのコードを見つけましたが、動作させることができませんでした。2 ページの pdf があり、最後のページを最初に表示したいと考えています。ページ番号が順序と一致する必要があるという例外が常に発生します。ドキュメント オブジェクトを確認すると、0 ページと表示されています。しかし、渡された PDF には 2 つのページがあります。

public void reOrder(string inputFile)
{ 
    Document document = new Document();
    FileStream fs = new FileStream(inputFile, FileMode.Open);
    PdfWriter writer = PdfWriter.GetInstance(document, fs);
    document.AddDocListener(writer);                
    writer.SetLinearPageMode();
    int[] order = {2,1};
    writer.ReorderPages(order);
}
4

3 に答える 3

3

Whenever you use iTextSharp to write something you need to create a new document, it will never write to an existing document. In your case, page reordering would require writing so you need create a new document, bring over the pages and then reorder them. (Of course, you could also just reorder them upon import, too.)

        var inputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
        var output = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Output.pdf");

        //Bind a reader to our input file
        var reader = new PdfReader(inputFile);

        //Create our output file, nothing special here
        using (FileStream fs = new FileStream(output, FileMode.Create, FileAccess.Write, FileShare.None)) {
            using (Document doc = new Document(reader.GetPageSizeWithRotation(1))) {
                //Use a PdfCopy to duplicate each page
                using (PdfCopy copy = new PdfCopy(doc, fs)) {
                    doc.Open();
                    copy.SetLinearPageMode();
                    for (int i = 1; i <= reader.NumberOfPages; i++) {
                        copy.AddPage(copy.GetImportedPage(reader, i));
                    }
                    //Reorder pages
                    copy.ReorderPages(new int[] { 2, 1 });
                    doc.Close();
                }
            }
        }
于 2012-07-03T13:59:51.837 に答える
1

@Chris Haasの答えは良いですが、それが唯一の方法ではありません。

これが私の状況でした:

  1. XMLWorker最初に、Razor ビューを使用してドキュメントを生成しました。
  2. 次に、ゼロから多数の画像をそれぞれ独自のページとして追加しました。
  3. 顧客は、画像ページが 1 ページに続くようにドキュメントを並べ替えたいと考えていました (つまり、2、3、4 ページなど)。

これを行うために使用したコードは次のとおりです。

    private static void MoveImagesToPage2(ICollection imagesToBePrintedOnSeparatePages, IDocListener pdfDocument, PdfWriter pdfWriter)
    {
        pdfDocument.NewPage(); // required - http://itextpdf.com/examples/iia.php?id=98

        var numberOfPages = pdfWriter.ReorderPages(null);
        var newOrder = new int[numberOfPages];
        newOrder[0] = 1; // Keep page 1 as page 1

        var i = 1;
        for (var j = imagesToBePrintedOnSeparatePages.Count - 1; 0 <= j; j--)
        {
            newOrder[i] = numberOfPages - j;
            i++;
        }

        for (; i < numberOfPages; i++)
        {
            newOrder[i] = i - (imagesToBePrintedOnSeparatePages.Count - 1);
        }

        pdfWriter.ReorderPages(newOrder);
    }

次の行に注意してください。

pdfDocument.NewPage(); // required - http://itextpdf.com/examples/iia.php?id=98

ドキュメントの最後のページを移動する場合は、この行が必要です。(理由はわかりません。 )

ただし、必要に応じて、完了後に空白のページを削除するために次の行が必要になります。

    private static byte[] RemoveTheLastPageWhichWasAddedForReordering(byte[] renderedBuffer)
    {
        var originalPdfReader = new PdfReader(renderedBuffer);

        using (var msCopy = new MemoryStream())
        {
            using (var docCopy = new Document())
            {
                using (var copy = new PdfCopy(docCopy, msCopy))
                {
                    docCopy.Open();
                    for (var pageNum = 1; pageNum <= originalPdfReader.NumberOfPages - 1; pageNum++)
                    {
                        copy.AddPage(copy.GetImportedPage(originalPdfReader, pageNum));
                    }
                    docCopy.Close();
                }
            }

            return msCopy.ToArray();
        }
    }

上記のスニペットについて@Craig Howardに感謝します。

于 2015-06-05T18:30:56.007 に答える
1

@Mathew Legerの回答から:

ページをトリミングするためのオプションは、PdfReader.SelectPages() を PdfStamper と組み合わせて使用​​することです。以下のコードは iTextSharp 5.5.1 で書きました。

public void SelectPages(string inputPdf, string pageSelection, string outputPdf)
{
    using (PdfReader reader = new PdfReader(inputPdf))
    {
        reader.SelectPages(pageSelection);

        using (PdfStamper stamper = new PdfStamper(reader, File.Create(outputPdf)))
        {
            stamper.Close();
        }
    }
}

次に、条件ごとに正しいページ選択でこのメソッドを呼び出すだけです。

条件 1:

SelectPages(inputPdf, "1-4", outputPdf);

条件 2:

SelectPages(inputPdf, "1-4,6", outputPdf);

また

SelectPages(inputPdf, "1-6,!5", outputPdf);

条件 3:

SelectPages(inputPdf, "1-5", outputPdf);

これは、ページ選択を構成するものに関する iTextSharp ソース コードからのコメントです。これは、ページの選択を処理するために使用される SequenceList クラスにあります。

/**
* This class expands a string into a list of numbers. The main use is to select a
* range of pages.
* <p>
* The general systax is:<br>
* [!][o][odd][e][even]start-end
* <p>
* You can have multiple ranges separated by commas ','. The '!' modifier removes the
* range from what is already selected. The range changes are incremental, that is,
* numbers are added or deleted as the range appears. The start or the end, but not both, can be ommited.
*/
于 2015-06-08T18:41:42.137 に答える