【问题标题】:Remove PdfName.Rotate value without rotation删除 PdfName.Rotate 值而不旋转
【发布时间】:2019-09-24 20:08:45
【问题描述】:

我必须将多个文件中的多个页面合并到一个新的 PDF 中。所有页面的页面方向必须是纵向的。

完成这项工作后,我正在使用几个程序将旋转重置为零,而无需真正旋转页面。

我想用 itext 去除旋转值。

取自 itext 示例,我尝试过这样的事情:

    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(DEST));
        int n = pdfDoc.getNumberOfPages();
        PdfPage page;
        PdfNumber rotate;
        for (int p = 1; p <= n; p++) {
            page = pdfDoc.getPage(p);
            rotate = page.getPdfObject().getAsNumber(PdfName.Rotate);
            page.setRotation(0);
        pdfDoc.close();
    }
}

这个:

PdfDictionary diccionario = page.getPdfObject();
diccionario.Remove(iText.Kernel.Pdf.PdfName.Rotate);

而函数CopyPagesTo 的结果相同:页面方向已更改。

这里有一个 0、90、180 y 270 度的示例文件。
目标是将所有页面的旋转值设置为零保持纵向模式

https://filebin.ca/4vep0uuU1p2s/1.pdf

任何建议将不胜感激。

【问题讨论】:

  • "protected voidurgicalPdf(String dest) throws Exception" 嗯,这不是 C#,它是 Java。编辑:这个问题中的每一行代码都是Java。为什么这被标记为 C#?
  • 有什么问题?如果您删除 90° 或 270° 的页面旋转,纵向页面根据定义变为横向。如果您想要纵向页面,请保持旋转。
  • 请打开示例文件。您将看到 4 个相同的页面。但它们有 0、90、180 和 270 度。
  • “您将看到 4 个相同的页面。但它们有 0、90、180 和 270 度。” - 是的。显然,通过删除 90° 或 270° 旋转值,您将获得横向页面。如果您想抵消这种情况,您将不得不大幅更改页面。您必须在内容流前面加上一个与缺少的旋转等效的转换。您必须调整所有应用页面框,至少是媒体框。您必须调整所有注释的位置(和其他坐标属性);如果它们有外观,则必须对其应用旋转。除非他们...
  • 除非他们设置了 NoRotate 标志,在这种情况下,您将不得不重新定位他们。您必须使用坐标调整所有目的地。当然还有其他一些任务。 ... 您确定您真的需要将页面轮换条目设为 0 吗?可能更容易改进您想要执行此操作的过程以便能够使用页面旋转进行操作...

标签: java itext7


【解决方案1】:

我找到了使用SetIgnorePageRotationForContent 函数的解决方案。

我很抱歉,但并不感到惊讶。这不是 C#,这不是 Java,而是 vb.net。

Dim srcPdf As iText.Kernel.Pdf.PdfDocument = New iText.Kernel.Pdf.PdfDocument(New iText.Kernel.Pdf.PdfReader(srcFile))
Dim destPDF As New iText.Kernel.Pdf.PdfDocument(New iText.Kernel.Pdf.PdfWriter(destFile))


                For contador = 1 To srcPdf.GetNumberOfPages

                    Dim srcPage = srcPdf.GetPage(contador)

                    Dim rotacion As iText.Kernel.Pdf.PdfNumber = srcPage.GetPdfObject().GetAsNumber(iText.Kernel.Pdf.PdfName.Rotate)


                    If IsNothing(rotacion) OrElse rotacion.IntValue = 0 Then
                        srcPdf.CopyPagesTo(contador, contador, destPDF)
                        Continue For
                    End If

                    Dim destPage As iText.Kernel.Pdf.PdfPage = destPDF.AddNewPage(New iText.Kernel.Geom.PageSize(srcPage.GetPageSizeWithRotation))

                    If rotacion.IntValue = 180 Then
                        destPage.GetPdfObject().Put(iText.Kernel.Pdf.PdfName.Rotate, New iText.Kernel.Pdf.PdfNumber(180))
                    Else
                        destPage.GetPdfObject().Put(iText.Kernel.Pdf.PdfName.Rotate, New iText.Kernel.Pdf.PdfNumber(rotacion.IntValue + 180))
                    End If

                    destPage.SetIgnorePageRotationForContent(True)


                    Dim canvas As New iText.Kernel.Pdf.Canvas.PdfCanvas(destPage)


                    Dim pageCopy As iText.Kernel.Pdf.Xobject.PdfFormXObject = srcPage.CopyAsFormXObject(destPDF)
                    canvas.AddXObject(pageCopy, 0, 0)

                    destPage.GetPdfObject().Remove(iText.Kernel.Pdf.PdfName.Rotate)

                Next
                destPDF.Close()
                srcPdf.Close()

谢谢。

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多