【问题标题】:PDF Shrink causing change in OrientationPDF收缩导致方向改变
【发布时间】:2018-07-14 01:01:34
【问题描述】:

我正在使用以下代码缩小 pdf。在缩小 PDF 页面之前可以在纵向中看到,但在缩小之后,它们的方向会变为横向。当我在收缩之前打印页面旋转时,它会变成 270 度。是什么导致页面缩小后旋转? (我要缩小的 PDF 有旧的扫描图像)

public  void shrinkPDF(String strFilePath , String strFileName) throws Exception {      
    PdfReader reader = new PdfReader(strFilePath+"//"+strFileName);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(strFilePath+"//Shrink_"+strFileName));
    int n = reader.getNumberOfPages();
    for (int p = 1; p <= 1; p++) {
        float offsetX = (reader.getPageSize(p).getWidth() * (1 - xPercentage)) / 2;
        float offsetY = (reader.getPageSize(p).getHeight() * (1 - yPercentage)) / 2;
        PdfDictionary page;
        PdfArray crop;
        PdfArray media;
        page = reader.getPageN(p);
        System.out.println("reader.getPateRoatation-->"+reader.getPageRotation(p));
        media = page.getAsArray(PdfName.CROPBOX);
        if (media == null) {
            media = page.getAsArray(PdfName.MEDIABOX);
        }
        crop = new PdfArray();
        crop.add(new PdfNumber(0));
        crop.add(new PdfNumber(0));
        crop.add(new PdfNumber(media.getAsNumber(2).floatValue()));
        crop.add(new PdfNumber(media.getAsNumber(3).floatValue()));
        page.put(PdfName.MEDIABOX, crop);
        page.put(PdfName.CROPBOX, crop);
        Rectangle mediabox = reader.getPageSize(p);
        stamper.getUnderContent(p).setLiteral(
                String.format("\nq %s %s %s %s %s %s cm\nq\n",
                xPercentage, mediabox.getLeft(),mediabox.getBottom(), yPercentage,  offsetX, offsetY));
        stamper.getOverContent(p).setLiteral("\nQ\nQ\n");           
    }
    stamper.close();
    reader.close();
}

【问题讨论】:

  • 请分享一个示例 pdf。除非您在标记过程中只使用该代码,否则请分享更完整的代码示例。
  • 我可以通过您的邮件 ID“mkl@wir-sind-cool.org”发送样本吗?
  • 没关系。明天我可能有时间对此进行调查。
  • 也就是说,我只是再次查看了您的代码,发现(与您之前问题中的代码相反)您使用非零值作为 的第二个和第三个参数cm 操作。这当然会导致一些旋转和/或倾斜。

标签: java itext pdf-generation


【解决方案1】:

原因

问题的原因是 iText 的一个特性:

iText 尝试通过旋转当前转换矩阵来启动过度内容和不足内容,从而简化向旋转页面添加信息的过程。这使得添加到页面的内容在 PDF 查看器中垂直显示,无需添加单独的旋转。

即使底层内容是在原始页面内容之前绘制的,这通常不会影响原始内容,因为整个底层内容都包含在保存图形状态/恢复图形状态指令对中。

不过,您用作底层内容的文字包含两个保存图形状态指令和没有恢复图形状态指令。这使得添加的旋转也会突然影响原始内容。因此,即使您只想缩放,您的原始内容也会被旋转。

修复

iText 允许您关闭上述功能。您可以在创建PdfStamper 后立即将PdfStamper 属性RotateContents 设置为false

PdfStamper stamper = new PdfStamper(reader, result);
stamper.setRotateContents(false);
int n = reader.getNumberOfPages();

现在 iText 不会再将这种旋转添加到内容不足的内容中,并且只会缩放您的原始内容。

PdfStamper 属性 RotateContents 已在 this answer 中进行了更深入的讨论。

注释注意事项

iText 不仅为页面内容流的不足和过度内容添加旋转,它还操纵添加到旋转页面的注释的尺寸,不幸的是PdfStamper 属性RotateContents 没有考虑到这一点。

在这种情况下,解决方法是在将注释添加到页面之前暂时删除页面Rotation条目,然后再将其放回原处。这已在this answerthis answerthis answer 中进行了更详细的讨论。

您的剩余代码

  • 您对裁剪框和媒体框的更改似乎没有必要,并且可能会产生意想不到的不良结果。

  • 你像这样添加收缩:

    stamper.getUnderContent(p).setLiteral(
            String.format("\nq %s %s %s %s %s %s cm\nq\n",
            xPercentage, mediabox.getLeft(),mediabox.getBottom(), yPercentage,  offsetX, offsetY));
    

    将第二个和第三个参数分别设置为 mediabox.getLeft()mediabox.getBottom() 通常不会产生不良影响(因为这些值通常为 0),但在某些情况下,您的(放大的部分)视图会非常扭曲页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多