2012-11-27 38 views
5

Vấn đề tôi đang gặp phải là như sau. Tôi có một tài liệu nguồn, src.pdf.Xoay một tệp PDF theo n độ, trong đó n không phải là bội số của 90

tôi cần phải chèn nội dung của src.pdf vào target.pdf, xoay bởi n độ, nơi n KHÔNG phải là một bội số của 90.

Bất kỳ trợ giúp sẽ được đánh giá, cảm ơn.

EDIT 1:

PDF không chứa chú thích.

Tôi có thể sử dụng bất kỳ giải pháp nào dựa trên các tiện ích hoặc viết mã của riêng tôi, tốt nhất là trong C#/Python/Ruby/Perl, nhưng không giới hạn ở một ngôn ngữ.

Nền tảng là Windows Server 2008 R2, tôi thích gắn bó với máy chủ hiện tại nhưng Linux cũng là một tùy chọn. GhostScript và pdftk mới nhất (ổn định) đã được cài đặt.

+2

Bạn có cần chương trình tiện ích hoặc là bạn cũng đã sẵn sàng để làm một số mã hóa cho một số thư viện helper? Nền tảng nào? Và nguồn PDF của bạn cũng có chứa chú thích, không chỉ nội dung trang tĩnh? – mkl

+1

Xin chào @mkl, tôi đã chỉnh sửa câu hỏi và thêm các chi tiết này để trả lời, cảm ơn bạn. – Roman

Trả lời

10

Nếu ngôn ngữ mới không phải là vấn đề, LateX có thể là một tùy chọn. Bạn có thể bao gồm một pdf như là một con số trong một tập tin tex, và bạn sẽ có thể sử dụng tùy chọn chuyên dụng như rescaling và chức năng xoay. Sau đó, biên dịch nó để có được một pdf mới. Mã rất đơn giản sau đây làm việc cho tôi:

\documentclass[a4paper]{article} 
\usepackage{graphicx} 

\begin{document} 

\includegraphics[scale=0.5,angle=10]{test.pdf} 

\end{document} 

Từ pdf này:

str

tôi nhận mới này:

enter image description here

Nó sẽ tuy nhiên cần một số điều chỉnh thủ công để có được chính xác những gì bạn muốn ...

+2

Cách tiếp cận thú vị! – yms

+3

@ sps thực sự, nhắc tôi về ngày đại học ...;) Trừ khi Roman đã sử dụng TeX trên hệ thống của mình, mặc dù, trông giống như một cài đặt khá lớn cho nhiệm vụ. – mkl

+1

Tôi quyết định đi với PDFLaTeX, vì nó cung cấp tất cả các thay đổi cần thiết, cắt, chuyển đổi và xoay các hoạt động trong một công cụ miễn phí duy nhất. Cảm ơn bạn rất nhiều về mẹo này! – Roman

3

tôi đã viết một số phần mềm có thể làm điều này:

cpdf Xoay-nội dung 45 in.pdf -o out.pdf

Commercial, tôi sợ. Xem Chương 3 của số manual.

+1

Tôi đã thử CPDF và thực sự nó thực hiện công việc và thực hiện tốt. Cũng khen ngợi và cảm ơn bạn đã hỗ trợ e-mail xuất sắc cho công cụ của bạn. Tôi hiện đang tiếp tục với giải pháp PDFLaTeX, nhưng câu trả lời của bạn cũng đủ điều kiện. – Roman

4

Vì bạn không phải đối phó với chú thích, bạn có thể thử sử dụng bất kỳ thư viện PDF nào mà bạn chọn cho phép bạn phân tích từ điển PDF và giải mã nội dung trang. Khi bạn nhận được nội dung trang, bạn có thể chèn transformation matrix vào đầu trang: [cos θ sin θ −sin θ cos θ 0 0]

Tôi khuyên bạn nên xem qua số PDF Reference Document từ Adobe, cụ thể là phần về ma trận chuyển đổi.

Ví dụ nếu bạn có các đối tượng nội dung trang sau (40 0 obj):

10 0 obj % Page object 
<< /Type /Page 
/Parent 5 0 R 
/Resources 20 0 R 
/Contents 40 0 R 
>> 
endobj 
40 0 obj % Page content 
BT 
/F1 1 Tf 
12 0 0 12 100 600 Tm 
(Hello) Tj 
ET 
endobj 

Và bạn muốn xoay toàn bộ trang bằng 45 độ, giả sử cos (45) = sin (45) = 0,7, nội dung trang kết quả của bạn sẽ là:

40 0 obj 
0.7 0.7 -0.7 0.7 0 0 cm 
BT 
/F1 1 Tf 
12 0 0 12 100 600 Tm 
(Hello) Tj 
ET 
endobj 

Sau khi bạn hoàn tất việc thêm ma trận chuyển đổi, bạn có thể soạn lại tệp PDF của mình. Thư viện bạn đã chọn sau đó sẽ thêm bộ lọc nén và bộ lọc mã hóa nếu cần.

Ví dụ iText có thể phân hủy và định dạng lại các tệp PDF. Xem phương thức PdfReader.getPageContent để biết chi tiết.

+0

Bạn thực sự có thể mở một pdf trong notepad và xem những gì bạn đã cho chúng ta thấy ở đây. Tôi có một máy quét tự động đọc sách, nhưng chúng luôn quanh co và Acrobat câm sẽ không tăng thêm. Tôi ước tôi có thể sử dụng phương pháp đơn giản này trên toàn bộ pdf được quét của mình. – bgmCoder

+1

@BGM Nếu bạn chỉ cần xử lý một tệp, hãy thử: http://stackoverflow.com/a/12630604/501196 Khi bạn nhận được bản pdf "giải nén", bạn có thể sửa đổi từng nội dung trang theo ý muốn. Bảng xref sẽ bị hỏng, nhưng bạn có thể sửa chữa nó bằng cùng một công cụ. – yms

+0

Điều đó qpdf có vẻ giống như một điều gọn gàng mà tôi phải có trong repoitoire của tôi! Cảm ơn bạn đã tham khảo. +1 – bgmCoder

5

Đây là một ví dụ cho thấy cách thực hiện điều đó bằng cách sử dụng Java và thư viện iText. Với những thay đổi tối thiểu mà mã nên có thể sử dụng được với C# và iTextSharp, quá, cho mẫu @neo không thể cung cấp thông báo ngắn trong câu trả lời của anh ta.

Mẫu lấy trang đầu tiên của source.pdf và chèn nó vào target.pdf trong tất cả bội số của 30 °, tức là 2 * pi/12, nhưng khi góc đó được cho rõ ràng trong mã, bạn có thể xoay theo bất kỳ góc nào.

Document document = new Document(); 
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("target.pdf")); 
document.open(); 

PdfReader origPdfReader = new PdfReader("source.pdf"); 
PdfImportedPage importedPage = writer.getImportedPage(origPdfReader, 1); 

PdfContentByte canvas = writer.getDirectContent(); 
for (int i = 0; i < 12; i++) 
{ 
    AffineTransform transform = AffineTransform.getRotateInstance(Math.PI * i/6.0, 
     importedPage.getWidth()/2, importedPage.getHeight()/2); 
    canvas.addTemplate(importedPage, transform); 
    document.newPage(); 
} 
document.close(); 

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể không chỉ muốn xoay vòng (như bạn đã yêu cầu) mà còn phải giảm tỷ lệ cho vừa với trang. Trong trường hợp đó, chỉ cần thêm transform.scale(scaleX, scaleY) trước khi sử dụng transform.

4

Bạn có thể làm điều đó với texlive như thế này:

\documentclass{article} 
\usepackage{pdfpages} 

\begin{document} 
    \includepdf[pages={-},angle=30]{main} 
\end{document} 

Nó sẽ xoay toàn bộ pdf - mỗi trang!

tôi không phải là một trong những người figured này ra, tuy nhiên - check this thread for the original solution (! Và cho rằng đồng một điểm)

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