1

私は現在pdf APIを書いています。選択した向きの異なるページを1つの文書に結合する方法があります。実行時に、選択したページが横向きの場合、そのようにマージしたいのですが、現在、すべてが縦向きに表示されています。

オンラインでいくつかの投稿を見ましたが、どれも役に立ちませんでした。

これは私が現在持っているものです:

public static void MergePDF(string source, string destination, PageCollection pages) {
        try {
            PdfReader reader = new PdfReader(new RandomAccessFileOrArray(source), null);


            Document doc = new Document();
            PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(destination, FileMode.Create));
            doc.Open();
            PdfContentByte contentByte = writer.DirectContent;

            foreach (Page page in pages) {
                float width = reader.GetPageSize(page.Number).Width;
                float height = reader.GetPageSize(page.Number).Height;


                PdfImportedPage pdfImportedPagepage = writer.GetImportedPage(reader, page.Number);

                doc.NewPage();
                if (width > height) {
                    doc.SetPageSize(PageSize.A4.Rotate());
                } else {
                    doc.SetPageSize(PageSize.A4);
                }
                iTextSharp.text.Rectangle psize = reader.GetPageSizeWithRotation(page.Number);

                switch (psize.Rotation) {
                    case 0:
                        contentByte.AddTemplate(pdfImportedPagepage, 1f, 0, 0, 1f, 0, 0);
                        break;
                    case 90:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(page.Number).Height);
                        break;
                    case 180:
                        contentByte.AddTemplate(pdfImportedPagepage, -1f, 0, 0, -1f, 0, 0);
                        break;
                    case 270:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(page.Number).Width, 0);
                        break;
                    default:
                        break;
                }

            }

            doc.Close();

        } catch (Exception ex) {

        }
    }

助けてくれてありがとう。

4

2 に答える 2

4
if (width > height) {
                    doc.SetPageSize(PageSize.A4.Rotate());

高さよりも幅が広い場合 (横長) は、縦長になるように回転する必要があるとプログラムに指示しました。その回転セグメントを削除するだけです

                switch (psize.Rotation) {
                    case 0:
                        contentByte.AddTemplate(pdfImportedPagepage, 1f, 0, 0, 1f, 0, 0);
                        break;
                    case 90:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(page.Number).Height);
                        break;
                    case 180:
                        contentByte.AddTemplate(pdfImportedPagepage, -1f, 0, 0, -1f, 0, 0);
                        break;
                    case 270:
                        contentByte.AddTemplate(pdfImportedPagepage, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(page.Number).Width, 0);
                        break;
                    default:
                        break;

この部分は、ページの向きを計算してどの程度回転させるかを把握しています。これを削除すると、すべてのページがそのままインポートされます。そのままにしておくと、すべて回転して縦に配置されます

于 2013-01-08T15:34:40.080 に答える
2

MKLの提案によると、これはうまくいきました:

 Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, new FileStream(destination, FileMode.Create));
            doc.Open();

            foreach (Page page in pages) {
                doc.NewPage();
                copy.AddPage(copy.GetImportedPage(reader, page.Number));
            }

ありがとう。

于 2013-01-08T16:39:40.593 に答える