web-dev-qa-db-ja.com

iTextSharpを使用してC#でPDF

私は以下の関数を使用してPDFを2つに分割しています。

PDFを分割していますが、内容が逆さまに表示されています。 180度回転させるにはどうすればよいですか。

助けてください。以下は同じのコードです

private static void ExtractPages(string inputFile, string outputFile,
  int start, int end)
     {
         // get input document
         PdfReader inputPdf = new PdfReader(inputFile);

         // retrieve the total number of pages
         int pageCount = inputPdf.NumberOfPages;

         if (end < start || end > pageCount)
         {
             end = pageCount;
         }

         // load the input document
         Document inputDoc =
             new Document(inputPdf.GetPageSizeWithRotation(1));

         // create the filestream
         using (FileStream fs = new FileStream(outputFile, FileMode.Create))
         {
             // create the output writer
             PdfWriter outputWriter = PdfWriter.GetInstance(inputDoc, fs);
             inputDoc.Open();

             PdfContentByte cb1 = outputWriter.DirectContent;

             // copy pages from input to output document
             for (int i = start; i <= end; i++)
             {
                 inputDoc.SetPageSize(inputPdf.GetPageSizeWithRotation(1));
                 inputDoc.NewPage();

                 PdfImportedPage page =
                     outputWriter.GetImportedPage(inputPdf, i);
                 int rotation = inputPdf.GetPageRotation(i);


                 if (rotation == 90 || rotation == 270)
                 {
                     cb1.AddTemplate(page, 0, -1f, 1f, 0, 0,
                         inputPdf.GetPageSizeWithRotation(i).Height);

                 }
                 else
                 {
                     cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                 }

             }

             inputDoc.Close();
         }
     }
14
acadia

私はあなたのコードを試しましたが、うまくいきました。分割されたページは元の向きを維持しました。

回避策は、ページを明示的に180度回転させることです。

交換:

_cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
_

と:

_cb1.AddTemplate(page, -1f, 0, 0, -1f, 
                inputPdf.GetPageSizeWithRotation(i).Width, 
                inputPdf.GetPageSizeWithRotation(i).Height);
_

inputPdf.GetPageRotation(i)を呼び出して180が返される場合は、次のifステートメントでこれを処理できます(ローテーションの推奨コード== 180を使用)。

2
Jay Riggs

上記の回答は、4つの主要な回転すべてで正しく回転しないことがわかりました。

以下は、0、90、180、および270を正しく処理するための私のコードです。これは、これらの各方向に回転したPDFでテストされています。

var pageRotation = reader.GetPageRotation(currentPageIndex);
var pageWidth = reader.GetPageSizeWithRotation(currentPageIndex).Width;
var pageHeight = reader.GetPageSizeWithRotation(currentPageIndex).Height;
switch (pageRotation)
{
    case 0:
        writer.DirectContent.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
        break;

    case 90:
        writer.DirectContent.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, pageHeight);
        break;

    case 180:
        writer.DirectContent.AddTemplate(importedPage, -1f, 0, 0, -1f, pageWidth, pageHeight);
        break;

    case 270:
        writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageWidth, 0);
        break;

    default:
        throw new InvalidOperationException(string.Format("Unexpected page rotation: [{0}].", pageRotation));
}
23
TimS

これを試してみてください。それは私のために働いた:

                if (rotation == 90 || rotation == 270)
                {

                    if (rotation == 90)
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pagenumber).Height);
                    }
                    if (rotation == 270)
                    {
                        cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(pagenumber).Width, 0);

                    }

                }
                else
                {
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
6
Jorge

@TimS 'の答えはほぼ完璧で、AddTemplateに正しいパラメーターを提供しましたが、PDFの90、180、270回転を可能にするためにいくつかの追加を行う必要がありました。ここで、ページすでにあります 0、90、180、または270の回転:

RotateFlipType rotateFlipTypeのパラメーターが関数に渡されて、回転を指定すると仮定します(GDI + RotateFlip呼び出しからの便利な列挙型)。

iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
iTextSharp.text.pdf.PdfImportedPage page;
int rotation;
int i = 0;
while (i < pageCount)
{
    i++;
    var pageSize = reader.GetPageSizeWithRotation(i);

    // Pull in the page from the reader
    page = writer.GetImportedPage(reader, i);

    // Get current page rotation in degrees
    rotation = pageSize.Rotation;

    // Default to the current page size
    iTextSharp.text.Rectangle newPageSize = null;

    // Apply our additional requested rotation (switch height and width as required)
    switch (rotateFlipType)
    {
        case RotateFlipType.RotateNoneFlipNone:
            newPageSize = new iTextSharp.text.Rectangle(pageSize);
            break;
        case RotateFlipType.Rotate90FlipNone:
            rotation += 90;
            newPageSize = new iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width, rotation);
            break;
        case RotateFlipType.Rotate180FlipNone:
            rotation += 180;
            newPageSize = new iTextSharp.text.Rectangle(pageSize.Width, pageSize.Height, rotation);
            break;
        case RotateFlipType.Rotate270FlipNone:
            rotation += 270;
            newPageSize = new iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width, rotation);
            break;
    }

    // Cap rotation into the 0-359 range for subsequent check
    rotation %= 360;

    document.SetPageSize(newPageSize);
    document.NewPage();

    // based on the rotation write out the page dimensions
    switch (rotation)
    {
        case 0:
            cb.AddTemplate(page, 0, 0);
            break;
        case 90:
            cb.AddTemplate(page, 0, -1f, 1f, 0, 0, newPageSize.Height);
            break;
        case 180:
            cb.AddTemplate(page, -1f, 0, 0, -1f, newPageSize.Width, newPageSize.Height);
            break;
        case 270:
            cb.AddTemplate(page, 0, 1f, -1f, 0, newPageSize.Width, 0);
            break;
        default:
            throw new System.Exception(string.Format("Unexpected rotation of {0} degrees", rotation));
            break;
    }
}

うまくいけば、これは受信PDFのローテーションを修正したい他の誰かに役立つでしょう。それを完成させるのに2日かかりました。

4
Gone Coding

上記のコードの古いコードの少しの変更

case 270:
    writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageWidth, 0);

新しいコード

case 270:
    writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageHeight, 0);

これにより、270度の回転に関する問題が修正されます

0
dayanand