7

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

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

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

编辑1:

PDF 不包含注释。

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

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

4

5 回答 5

15

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

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

\begin{document}

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

\end{document}

从此pdf:

字符串

我得到了这个新的:

在此处输入图像描述

然而,它需要一些手动调整才能得到你想要的……

于 2012-11-27T17:06:20.580 回答
7

你可以像这样使用 TexLive 做到这一点:

\documentclass{article}
\usepackage{pdfpages}

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

它将旋转整个 pdf - 每页!

但是,我不是想出这一点的人-检查此线程以获取原始解决方案(并给那个人一点!)

于 2015-03-17T02:29:05.900 回答
6

由于您不必处理注释,因此您可以尝试使用您选择的任何 PDF 库来分解 PDF 字典和解码页面内容。获得页面内容后,可以在页面开头插入一个变换矩阵: [ cos θ sin θ −sin θ cos θ 0 0 ]

我建议您查看 Adob​​e 的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

并且您想将整个页面旋转 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

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

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

于 2012-11-27T16:08:08.507 回答
6

这是一个示例,展示了如何使用 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();

根据您的用例,您可能不仅想要旋转(如您所要求的那样),而且还希望将其缩小以适合页面。在这种情况下,只需transform.scale(scaleX, scaleY)在使用transform.

于 2012-11-28T09:11:36.493 回答
4

我写了一些软件可以做到这一点:

cpdf -rotate-contents 45 in.pdf -o out.pdf

商业,我害怕。请参阅手册第 3 章。

于 2012-11-27T15:36:52.267 回答