2010-12-17 62 views
7

iTextSharpを既存のDocument Imagingアプリケーションに統合しようとしています。これにより、スキャンされた個々のページを不適切な角度それは私が考えたよりも頻繁に起こる)。既存のマルチページPDFでiTextSharp/VBで単一ページを90度回転させる

実際のページデータは90度から180度まで正しく回転していますが、ページの向きはそれに沿って回転していません。私はちょうどiTextSharpを使って作業を始めました。私はまだそのメソッドに慣れていませんが、StackOverflowの投稿を使ってこれまでのことを一緒にまとめることができました。それは近いが、それほどではない。ここで

は、私がこれまで持っているものです。

' Get the input document and total number of pages 
Dim inputPdf As New iTextSharp.text.pdf.PdfReader(fileName) 
Dim pageCount As Integer = inputPdf.NumberOfPages 

' Load the input document 
Dim inputDoc As New iTextSharp.text.Document(inputPdf.GetPageSizeWithRotation(1)) 

' Set up the file stream for our output document 
Dim outFileName As String = Path.ChangeExtension(fileName, "pdf") 
Using fs As New FileStream(outFileName, FileMode.Create) 
    ' Create the output writer 
    Dim outputWriter As iTextSharp.text.pdf.PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(inputDoc, fs) 
    inputDoc.Open() 

    ' Copy pages from input to output document 
    Dim cb As iTextSharp.text.pdf.PdfContentByte = outputWriter.DirectContent 
    For index As Integer = 1 To pageCount 
     inputDoc.SetPageSize(inputPdf.GetPageSizeWithRotation(index)) 
     inputDoc.NewPage() 

     ' If this is our page to be rotated, perform the desired transform 
     ' TODO - 90 degree rotations need to change the page orientation as well 
     Dim page As iTextSharp.text.pdf.PdfImportedPage = outputWriter.GetImportedPage(inputPdf, index) 
     If index = pageNum Then 
      Select Case angle 
       Case 90 
        cb.AddTemplate(page, 0, -1, 1, 0, 0, page.Height) 
       Case 180 
        cb.AddTemplate(page, -1, 0, 0, -1, page.Width, page.Height) 
       Case 270 
        cb.AddTemplate(page, 0, 1, -1, 0, page.Width, 0) 
       Case Else 
        ' Should not be here, but don't do anything 
        cb.AddTemplate(page, 1, 0, 0, 1, 0, 0) 
      End Select 
     Else 
      ' No rotation; add as is 
      cb.AddTemplate(page, 1, 0, 0, 1, 0, 0) 
     End If 
    Next 
    inputDoc.Close() 
End Using 

は、私は、既存のページからページサイズを取得し、回転角度が90または270だった場合の寸法を交換するために先頭に次のコードを追加してみました:

For index As Integer = 1 To pageCount 
Dim pageSize As iTextSharp.text.Rectangle = inputPdf.GetPageSizeWithRotation(index) 
If angle = 90 OrElse angle = 270 Then 
    ' For 90-degree rotations, change the orientation of the page, too 
    pageSize = New iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width) 
End If 
inputDoc.SetPageSize(pageSize) 
inputDoc.NewPage() 

は残念ながら、これはすべてのページ90度回転させる効果を持っていた、と私は望んでいたページのデータは、それがダウンシフトした(とにかく正しい場所に表示し、ページAから外れていなかった回転しますビット)。

私が言ったように、私は実際にAPIの内部の仕組みに精通していません。私はsourceforgeページでサンプルをオンラインでチェックしており、本(両方のエディション)を見てきましたが、私はこの請求書に適合するものは何も見ません。ここでは、新しく作成されたPDFのページの向きを示す例を見ましたが、既存のPDFのページの向きはありません。誰か助けてくれますか?ありがとう!

答えて

7

これは、必要以上に難しくしています。

ではなくページの内容を回転、ページ自体回転したい:

PdfReader reader = new PdfReader(path); 
PdfStamper stamper = new PdfStamper(reader, outStream); 

PdfDictionary pageDict = reader.getPageN(desiredPage); 
int desiredRot = 90; // 90 degrees clockwise from what it is now 
PdfNumber rotation = pageDict.getAsNumber(PdfName.ROTATE); 
if (rotation != null) { 
    desiredRot += rotation.intValue(); 
    desiredRot %= 360; // must be 0, 90, 180, or 270 
} 
pageDict.put(PdfName.ROTATE, new PdfNumber(desiredRot); 


stamper.close(); 

それです。 desiredPagedesiredRotで遊んで、後で効果を得ることができます。楽しい。

+0

これは絶対に完璧です。私はあなたがpageDict.putコマンドでdesiredRotを意味し、curRotではなく、トリックを行ったようだと仮定しました。うーん、私は私のページフリップ変換をやっている方法を再評価する必要があるかもしれません。どうもありがとうございました! –

+0

正解、それについて申し訳ありません。私はそれを修正するコードを編集しました。喜んで助けてください。 –

+0

私はこのトリックがページフリップをするのにも役立つだろうと思いませんか?ナー、おそらくない。私はフリップを処理するために今すぐ変換を行いますが、フォームデータを強制終了するという効果があります。そして再び、スキャンされたPDFを反転させることは非常にまれなことになるだろうと推測しているので、おそらくそれほど心配する必要はありません。再度、感謝します! –

関連する問題