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

将PDF文件旋转n度,其中n不是90的倍数,pdf,Pdf,我面临的问题如下。我有一个源文件src.pdf 我需要将src.pdf的内容插入target.pdf,旋转n度,其中n不是90的倍数 任何帮助都将不胜感激,谢谢 编辑1: PDF不包含任何注释 我可以使用任何依赖于实用程序的解决方案,或者编写自己的代码,最好是用C#/Python/Ruby/Perl,但不限于一种语言 平台是WindowsServer2008R2,我更喜欢使用现有的服务器,但Linux也是一种选择。最新(稳定)的GhostScript和pdftk已经安装。我编写了一些软件,可以做

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

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

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

编辑1:

PDF不包含任何注释

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


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

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

cpdf-旋转内容45 in.pdf-o out.pdf


恐怕。请参阅。

的第3章,因为您不必处理注释,所以可以尝试使用您选择的任何PDF库,该库允许您分解PDF字典并解码页面内容。获得页面内容后,可以在页面开头插入一个:[cosθsinθ]−sinθcosθ0]

我建议大家看看Adobe的,特别是关于转换矩阵的部分

例如,如果您有以下页面内容对象(40 0 obj):

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


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

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

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

\begin{document}

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

\end{document}
从本pdf:

我得到了这个新的:


然而,它将需要一些手动调整来获得您想要的东西…

这是一个示例,展示了如何使用Java和iText库来实现这一点。只要对代码进行最小的修改,C#和iTextSharp也应该可以使用,给样本@neo在他的回答中无法在短时间内提供

该示例获取
source.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();
Document Document=新文档();
PdfWriter writer=PdfWriter.getInstance(文档,新文件输出流(“target.pdf”);
document.open();
PdfReader origPdfReader=新的PdfReader(“source.pdf”);
PdfImportedPage importedPage=writer.getImportedPage(origPdfReader,1);
PdfContentByte canvas=writer.getDirectContent();
对于(int i=0;i<12;i++)
{
仿射变换=仿射变换.getRotateInstance(Math.PI*i/6.0,
importedPage.getWidth()/2,importedPage.getHeight()/2);
canvas.addTemplate(导入页面,转换);
document.newPage();
}
document.close();

根据您的使用情况,您可能不仅希望旋转(如您所要求的),而且还希望缩小它以适应页面。在这种情况下,只需添加
transform.scale(scaleX,scaleY)
即可使用
transform

使用TexLive执行此操作,如下所示:

\documentclass{article}
\usepackage{pdfpages}

\begin{document}
  \includepdf[pages={-},angle=30]{main}
\end{document}
它将旋转整个pdf-每一页


然而,我并不是那个弄明白这一点的人-(给那个家伙一个要点!)

你需要实用程序吗,或者你也准备好了在一些助手库中进行编码吗?哪个站台?您的源PDF是否也包含注释,而不仅仅是静态页面内容?您好@mkl,我编辑了问题并添加了这些详细信息作为回应,谢谢。@yms确实让我想起了大学时代……;)不过,除非Roman已经在他的系统上使用了TeX,否则考虑到这项任务,这看起来是一个相当大的安装。我决定使用PDFLaTeX,因为它在一个单独的免费工具中提供所有必需的移位、剪切、转换和旋转操作。非常感谢你的提示@Roman嘿,我有PDFLaTex-你如何旋转你现有的pdf文档?我如何以这种方式旋转多页pdf的每一页?使用这种方法只会得到第一页,我已经尝试了CPDF,它确实可以完成这项工作,而且做得很好。同时也赞扬并感谢您为您的工具提供了出色的电子邮件支持。我目前正在使用PDFLaTeX解决方案,但您的答案也符合要求。您可以在记事本中打开pdf,查看您在此处向我们展示的内容。我有一个自动扫描书籍的扫描仪,但它们总是弯曲的,而且愚蠢的Acrobat不会这样做。我希望我能在整个扫描的pdf上使用这个简单的方法。@BGM如果你只需要处理一个文件,试试这个:一旦你得到一个“解压缩”的pdf,你可以随意修改每个页面的内容。外部参照表将损坏,但您可能可以使用相同的工具修复它。qpdf似乎是我必须在repoitoire中保存的一个整洁的东西!谢谢你的推荐+1.
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();
\documentclass{article}
\usepackage{pdfpages}

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