【问题标题】:How to rotate a pdf file "really" using iText7如何使用 iText7 旋转 pdf 文件“真的”
【发布时间】:2022-11-25 07:36:41
【问题描述】:

我想顺时针旋转一个pdf文件并保留页面旋转的框。官方示例代码:

      PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
            for (int p = 1; p <= pdfDoc.GetNumberOfPages(); p++) 
            {
                PdfPage page = pdfDoc.GetPage(p);
                int rotate = page.GetRotation();
                if (rotate == 0) {
                    page.SetRotation(90);
                }
                else 
                {
                    page.SetRotation((rotate + 90) % 360);
                }
            }
            pdfDoc.Close();

貌似每页只设置一个旋转数据,我要旋转,保持Rotation=0。

使用srcfile,我用代码得到了结果I wanted

string src = @"-x-y_28P_src.pdf";
string targetFPath = @"-x-y_28P_real_rotated.pdf";
using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(targetFPath)))
using (PdfDocument origPdf = new PdfDocument(new PdfReader(src)))
{
    pdfDoc.GetWriter().SetSmartMode(true);
    int pageCount = origPdf.GetNumberOfPages();
    for (int i = 1; i <= pageCount; i++)
    {
        PdfPage origPage = origPdf.GetPage(i);
        var pageCopy = origPage.CopyAsFormXObject(pdfDoc);
        var mediaBox = origPage.GetMediaBox();//x = -8.5,y=-8.5
        var cropBox = origPage.GetCropBox();
        var trimBox = origPage.GetTrimBox();
        var mediaRect90 = new Rectangle(0, 0, mediaBox.GetHeight(), mediaBox.GetWidth());//media:0,0,h,w,data from pdfinfo of xpdf.
        var page = pdfDoc.AddNewPage(new PageSize(mediaRect90));//media:0,0,h,w
        var canvas = new PdfCanvas(page);
        canvas.AddXObject(pageCopy, 0, -1, 1, 0, 0 - mediaBox.GetBottom(), mediaBox.GetRight());//Clockwise

        var cropbox = new Rectangle(0, 0, cropBox.GetHeight(), cropBox.GetWidth());
        page.SetCropBox(cropbox);
        var trimbox = new Rectangle(-mediaBox.GetBottom(), -mediaBox.GetLeft(), trimBox.GetHeight(), trimBox.GetWidth());
        page.SetTrimBox(trimbox);//important
    }
}

对于the other file,无论我怎么尝试都无法得到the correct result

另外,我实现的方法好像有点复杂。

有什么办法可以处理吗。

【问题讨论】:

  • @mkl 有什么办法吗?
  • @zhusp“有什么办法吗?”- 当然有。但是完整的通用解决方案显然很重要,尤其是在涉及注释和目的地的情况下。
  • 谢谢您的回复!如果我们不考虑注释和目的地,只应用一个矩阵?
  • @zhusp 如果我记得有些方法可以将大多数对象转换为新鲜的,但简单的矩阵转换是观众正在做的简单地旋转可以保存为页面视图旋转的视角,因此对于每个源案例都可以不同于旋转操作来自 qpdf“无法保证实际页面内容本身不会以旋转方式绘制,在这种情况下,将旋转重置为 0 不一定会使页面看起来直立。您可以为每个页面提取旋转信息”

标签: c# .net-6.0 itext7


【解决方案1】:

更改 PDF 以进行旋转通常会涉及重写或页面数据的某些部分,因此这里是上述来源和扩展的愿望,以显示一些可能需要在新重建中旋转的差异。

值得注意的是,当 PDF 被重写时,对象通常会改变相对位置,所以左边的对象 2 变成了右边的对象 3,虽然不是必需的,但它们变成了一个新的顺序,这当然很常见。

另一个非常常见的区别是单位通常会重新计算,因此在一种情况下 0.9 变为 .9,而在另一种情况下,旋转的页面尺寸变为不同的精度,从一种情况下的 595.28 到另一种情况下的 595.280029296。每一代人,就像基因突变一样,可以有不同的特征。

cpdf 具有规范化功能,以确保页面处于共同原点并处于默认旋转状态,因此我们可以将所有内容预设为 0 直立,以便更容易完全旋转,或者我们可以稍后再做,但是在这种情况下它会干扰/TrimBox 设置的视口,因此需要监控。

Page 1:
Label:
MediaBox: -8.503940 -8.503940 603.780000 850.394000
CropBox: -8.503940 -8.503940 603.780000 850.394000
BleedBox: -8.503940 -8.503940 603.780000 850.394000
TrimBox: 0.000000 0.000000 595.276000 841.890000
ArtBox: 8.503940 8.503940 586.772000 833.386000
Rotation: 0

在 cpdf -upright 之后

Page 1:
Label:
MediaBox: 0.000000 0.000000 612.283940 858.897940
CropBox: 0.000000 0.000000 612.283940 858.897940
BleedBox: 0.000000 0.000000 612.283940 858.897940
TrimBox: 8.503940 8.503940 603.779940 850.393940
ArtBox: 17.007880 17.007880 595.275940 841.889940
Rotation: 0

现在我们可以考虑绕 0,0 轴顺时针旋转 90 度

-rotateby 90 "upright.pdf" -o "rotated.pdf"

这自然会报告

Page 1:
Label:
MediaBox: 0.000000 0.000000 612.283940 858.897940
CropBox: 0.000000 0.000000 612.283940 858.897940
BleedBox: 0.000000 0.000000 612.283940 858.897940
TrimBox: 8.503940 8.503940 603.779940 850.393940
ArtBox: 17.007880 17.007880 595.275940 841.889940
Rotation: 90

现在我们可以再次将其设置为直立,我们越来越接近方向现在好像横向但内容是非常规的从左阅读(绘图的标准惯例是从右阅读)“如果您已经布置了很多文本,请使其在旋转后可以从右侧阅读。”

-upright "rotated.pdf" -o penultimate.pdf

Page 1:
Label:
MediaBox: 0.000000 0.000000 858.897940 612.283940
CropBox: 0.000000 0.000000 858.897940 612.283940
BleedBox: 0.000000 0.000000 858.897940 612.283940
TrimBox: 8.503940 8.504000 850.393940 603.780000
ArtBox: 17.007880 17.008000 841.889940 595.276060
Rotation: 0

最后,我们可以将裁剪框重置为新的原点 8.504 8.504 以及所需的宽度和高度 841.890 和 595.276 结果是 0 倒置阅读顺时针旋转 pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2016-10-15
    相关资源
    最近更新 更多