2010-12-17 42 views
7

Tôi đang cố gắng tích hợp iTextSharp vào ứng dụng Tài liệu hiện có cho phép người dùng xoay các trang riêng lẻ có thể được quét ở góc không chính xác (nó xảy ra thường xuyên hơn tôi nghĩ).Xoay một trang 90 độ với iTextSharp/VB trong nhiều trang PDF hiện có

Tôi có dữ liệu trang thực tế xoay chính xác trên 90/180 độ, nhưng hướng trang không xoay cùng với nó. Tôi đã bắt đầu làm việc với iTextSharp, vì vậy tôi vẫn còn một chút không quen thuộc với các phương pháp của nó, nhưng đã có thể cobble với nhau những gì tôi có cho đến nay bằng cách sử dụng các bài viết từ StackOverflow. Nó gần, nhưng không hoàn toàn ở đó.

Dưới đây là những gì tôi có cho đến nay:

' 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 

Tôi đã thử thêm đoạn mã sau vào phía trên để lấy kích thước trang từ trang hiện hành và trao đổi các kích thước nếu góc quay là 90 hoặc 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() 

Thật không may, điều này có tác dụng xoay mỗi trang 90 độ, và các dữ liệu trên trang tôi muốn quay không xuất hiện ở vị trí chính xác nào (nó đã được chuyển xuống và ra ngoài trang một bit).

Như tôi đã nói, tôi không thực sự quen thuộc với các hoạt động bên trong của API. Tôi đã xem các ví dụ trực tuyến tại trang sourceforge và đã xem xét cuốn sách (cả hai ấn bản), nhưng tôi không thấy bất kỳ điều gì phù hợp với hóa đơn. Tôi đã xem ví dụ ở đây cho thấy hướng trang cho các tệp PDF mới được tạo nhưng không có gì cho các tệp hiện có. Ai có thể giúp tôi không? Cảm ơn!

Trả lời

7

Bạn đang thực hiện điều này khó hơn mức cần thiết.

Thay vì xoay nội dung trang, bạn muốn xoay trang đó:

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(); 

Vậy là xong. Bạn có thể chơi xung quanh với desiredPagedesiredRot để nhận bất kỳ hiệu ứng nào bạn đang theo dõi. Thưởng thức.

+0

Điều đó ... hoàn toàn hoàn hảo. Tôi giả sử bạn có nghĩa là mong muốnRot trong lệnh pageDict.put, và không curRot, và nó có vẻ đã thực hiện các trick. Rất tiếc, tôi có thể phải đánh giá lại cách tôi cũng đang thực hiện chuyển đổi lật trang của mình. Cảm ơn nhiều! –

+0

Đúng, xin lỗi về điều đó. Tôi đã chỉnh sửa mã để sửa nó. Vui mừng được giúp đỡ. –

+0

Tôi không cho rằng mẹo này cũng có tác dụng làm việc lật trang, phải không? Không, có lẽ không. Tôi làm một biến đổi ngay bây giờ để xử lý flips, nhưng nó có tác dụng giết chết bất kỳ dữ liệu mẫu. Sau đó, một lần nữa, tôi đoán rằng việc quét các tệp PDF được lật sẽ là một điều rất hiếm, vì vậy tôi có thể không cần phải lo lắng về nó nhiều. Cảm ơn một lần nữa! –

Các vấn đề liên quan