Java 如何使用PdfBox缩放pdf文件

Java 如何使用PdfBox缩放pdf文件,java,android,pdf,pdfbox,Java,Android,Pdf,Pdfbox,我尝试在复印机中缩放pdf文件,比如缩放功能,可以按百分比缩放文档(如下图所示:),我使用pdfbox管理我的pdf文件。我试过这个代码,但为什么它不起作用?代码中没有错误 void Scale(){ try { PDDocument doc = PDDocument.load(new File(filePath)); for (int p = 0; p < doc.getNumberOfPages(); ++p) {

我尝试在复印机中缩放pdf文件,比如缩放功能,可以按百分比缩放文档(如下图所示:),我使用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();
    }
}
void Scale(){
尝试
{
PDDocument doc=PDDocument.load(新文件(文件路径));
对于(int p=0;p
有人知道为什么该代码不起作用吗?

编辑
首先,我需要它在API 16上工作

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

如果您想一想,就会发现
transform
方法显然无法将矩形更改为转换的结果,因为任意仿射转换的结果不再需要是矩形,特别是与页面边缘平行的矩形

也就是说,即使您的代码缩放了媒体框,结果仍然不是您想要的,结果pdf将只显示原始页面的一部分,因为您将只缩放画布的可见部分,而不是其内容

因此,除了实际缩放媒体盒外,还必须缩放内容。也就是说,您必须为页面内容预先挂起一个额外的内容流,并通过缩放转换更改当前转换矩阵

首先

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

如果您想一想,就会发现
transform
方法显然无法将矩形更改为转换的结果,因为任意仿射转换的结果不再需要是矩形,特别是与页面边缘平行的矩形

也就是说,即使您的代码缩放了媒体框,结果仍然不是您想要的,结果pdf将只显示原始页面的一部分,因为您将只缩放画布的可见部分,而不是其内容


因此,除了实际缩放媒体盒外,还必须缩放内容。也就是说,您必须为页面内容预先挂起一个额外的内容流,并通过缩放转换更改当前转换矩阵

transform()返回一个路径。这并不能改变论点。我想你想要的是:我需要它在api 16上工作,这个代码PDPageContentStream cs=new PDPageContentStream(doc,page,AppendMode.PREPEND,true)只在api 19及以上工作抱歉我没有注意到它是关于Android的PDFBox的。我不知道他们是否实现过前置功能。最好是1)在PDFBox桌面上实现它,看看它是否是您需要的;您显然想要的(使矩形变小)只是创建一个较小的媒体框,而不是使内容变小。如果是,请查看源代码如何完成“预编”操作,然后使用适用于Android的PDFBox执行此操作,即将原始数据插入到内容流/内容流数组中。实际上,我想使内容变小,最好的方法是在进行转换的页面内容流中预编代码,例如,0.9 0 0.9 0 cm\n.PDRectangle.transform()返回路径。这并不能改变论点。我想你想要的是:我需要它在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厘米\n。