将PDF文件旋转n度,其中n不是90的倍数

Rom*_*man 6 pdf

我面临的问题如下.我有一个源文档src.pdf.

我需要将src.pdf的内容插入到target.pdf中,旋转n度,其中n不是90的倍数.

任何帮助将不胜感激,谢谢.

编辑1:

PDF不包含注释.

我可以使用任何依赖于实用程序的解决方案,或编写我自己的代码,最好是在C#/ Python/Ruby/Perl中,但不限于语言.

该平台是Windows Server 2008 R2,我更喜欢坚持现有服务器,但Linux也是一种选择.最新(稳定)GhostScript和pdftk已经安装.

Rem*_*y F 12

如果新语言不是问题,LateX可能是一个选项.您可以在tex文件中包含pdf作为图形,并且您将能够使用重新缩放和旋转功能等专用选项.然后,编译它以获得新的pdf.以下非常简单的代码适用于我:

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

\begin{document}

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

\end{document}
Run Code Online (Sandbox Code Playgroud)

从这个pdf:

海峡

我得到了这个新的:

在此输入图像描述

然而,它需要一些手动的调整来获得你想要的......

  • @yms确实让我想起了大学时代......;)除非罗曼已经在他的系统上使用了TeX,否则看起来这个任务的安装非常重要. (3认同)
  • 有趣的方法! (2认同)

yms*_*yms 6

由于您不必处理注释,因此您可以尝试使用您选择的任何 PDF 库,这些库允许您分解 PDF 词典并解码页面内容。获取页面内容后,可以在页面开头插入一个变换矩阵:[ cos ? 罪??罪?cos ? 0 0 ]

我建议您查看Adobe的PDF 参考文档,特别是有关转换矩阵的部分。

例如,如果您有以下页面内容对象 (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
Run Code Online (Sandbox Code Playgroud)

并且您想将整个页面旋转 45 度,假设 cos(45)=sin(45)=0.7,您生成的页面内容将是:

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
Run Code Online (Sandbox Code Playgroud)

添加完转换矩阵后,您可以重新编写 PDF 文件。您选择的库随后应根据需要添加压缩过滤器和编码过滤器。

例如,iText 可以分解和重组 PDF 文件。有关详细信息,请参阅方法 PdfReader.getPageContent。


mkl*_*mkl 5

这是一个示例,说明如何使用Java和iText库执行此操作.由于C#和iTextSharp代码应该可以使用的代码变化很小,因此提供样本@neo无法在他的答案中提供短时间通知.

样本取第一页source.pdf并将其插入target.pdf所有30°的倍数,即2*pi/12,但由于该角度在代码中明确给出,您可以旋转任何角度.

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();
Run Code Online (Sandbox Code Playgroud)

根据您的使用情况,您不仅可以旋转(按照您的要求),还可以将其缩小以适合页面.在这种情况下,只需transform.scale(scaleX, scaleY)在使用之前添加transform.


bgm*_*der 5

您可以使用TexLive这样做:

\documentclass{article}
\usepackage{pdfpages}

\begin{document}
  \includepdf[pages={-},angle=30]{main}
\end{document}
Run Code Online (Sandbox Code Playgroud)

它会旋转整个pdf - 每一页!

我不是那个想出来的人,但是 - 检查这个帖子是否有原始解决方案(给那个人一点!)