【问题标题】:How to scale pdf file using PdfBox如何使用 PdfBox 缩放 pdf 文件
【发布时间】:2019-06-16 18:15:03
【问题描述】:

我正在尝试缩放 pdf 文件,例如复印机中的缩放功能,可以按百分比缩放文档(例如:https://inspectapedia.com/graphics/Safari_Page_Setup.jpg),我正在使用 pdfbox 来管理我的 pdf 文件。我已经尝试过这段代码,但为什么它不起作用?代码没有错误。

void Scale(){
    try
    {
        PDDocument doc = PDDocument.load(new File(filePath));
        for (int p = 0; p < doc.getNumberOfPages(); ++p)
        {
            PDRectangle mediaBox = doc.getPage(p).getMediaBox();
            mediaBox.transform(Matrix.getScaleInstance(0.5f, 0.5f));
            doc.getPage(p).setMediaBox(mediaBox);
        }

        doc.save(new File(filePathEdited));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

有人知道为什么该代码不起作用吗?

编辑
我需要它来处理 API 16

【问题讨论】:

  • PDRectangle.transform() 返回一个路径。它不会改变论点。我想你想要的是这个:stackoverflow.com/a/49689891/535646
  • 我需要它在 api 16 上工作,此代码 PDPageContentStream cs = new PDPageContentStream(doc, page, AppendMode.PREPEND, true) 仅适用于 api 19 及更高版本
  • 对不起,我没有注意到它是关于 Android 版 PDFBox 的。我不知道他们是否曾经实现过前置功能。最好的方法是 1)为 PDFBox 桌面实现它,看看它是否是你需要的;您显然想要的(使矩形更小)只会创建一个更小的媒体框,但不会使内容更小。如果是,那么请查看源代码中的“前置”操作是如何完成的,然后使用适用于 Android 的 PDFBox 执行此操作,即将原始缩放命令插入内容流/内容流数组。
  • 其实我是想让内容变小
  • 是的,要做到这一点,最好的方法是在页面内容流中预先添加代码进行转换,例如0.9 0 0 0.9 0 0 厘米 \n .

标签: java android pdf pdfbox


【解决方案1】:

首先,

mediaBox.transform(Matrix.getScaleInstance(0.5f, 0.5f));

不会mediaBox 更改为原来大小的一半。相反,它返回代表缩放矩形的路径;当您忽略该表达式的返回值时,您的这行代码本质上是一个 NOP(无操作)。

如果您考虑一下,您会发现transform 方法显然无法将矩形更改为变换的结果,因为任意仿射变换的结果不再需要是矩形,在特别是不平行于页面边缘。

话虽如此,即使您的代码缩放了媒体框,结果仍然不是您想要的,结果 pdf 将仅显示原始页面的一部分,因为您只会缩放可见部分 的画布,但不是它的 内容

因此,除了实际缩放媒体框外,您还必须缩放内容。 IE。您必须在页面内容之前添加一个额外的内容流,并通过缩放转换更改当前的转换矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多