0

0

使用 PDFBox 确定 PDF 中的内容缩放比例

PHPz

PHPz

发布时间:2024-02-14 14:54:08

|

532人浏览过

|

来源于stackoverflow

转载

在处理pdf文件时,确定内容的缩放比例是一项重要的任务。php小编小新将为您介绍一种使用pdfbox库来实现此目的的方法。pdfbox是一个开源的java库,它提供了一套强大的api,可以用于处理pdf文件。通过使用pdfbox,我们可以轻松地获取pdf文件中的内容,并确定其适当的缩放比例,以便在不同的设备上正确显示。无论您是在开发一个pdf阅读器还是需要在您的应用程序中处理pdf文件,本文都将为您提供详细的指导。让我们开始吧!

问题内容

我有一个 pdf,其中包含扫描文档的图像。页面内容如下:

第一个内容流

0.36 0 0 0.36 0 0 cm
q
  2200 0 0 1700 0 0 cm
  /im1 do
q

页面似乎缩放至原始大小的 36%。此外,这是在没有保存/恢复的情况下完成的,因此它会影响页面中的后续流。

我需要使用带有新内容流的 pdfbox 将文本添加到页面。为了修复缩放,我计算了缩放的倒数并将其添加到我的文本之前:

第二个内容流

q
  2.77778 0 0 2.77778 0 0 cm
  bt
    0 tr
    /f1 37.75083 tf
    67 531 td
    /devicergb cs
    1 0 0 sc
    1 0 0 1 67 531 tm
    (\000u\000r\000j\000h\000u\000v\000r\000q) tj
  et
q

这工作正常,但我需要根据页面的当前状态而不是硬编码值以编程方式计算缩放。我试图使用 pdfbox 来查找当前的缩放比例,但它始终是 1.0:

@sneakythrows
    @test
    void debug() {
        var source = new classpathresource("pdf/scaling/test.pdf").getfile();
        @cleanup var pdf = pddocument.load(source);
        var page = pdf.getpage(0);
        assertequals(0.36, page.getmatrix().getscalex());
        assertequals(0.36, page.getmatrix().getscaley());
    }
assertionfailederror: 
expected :0.36
actual   :1.0

我假设需要渲染页面才能确定实际的缩放比例。使用pdfstreamengine处理页面,我仍然看到缩放为1:

Magician
Magician

Figma插件,AI生成图标、图片和UX文案

下载
@sneakythrows
    @test
    void scalingdetection() {
        var source = new classpathresource("pdf/scaling/test.pdf").getfile();
        @cleanup var pdf = pddocument.load(source);
        debugstreamengine engine = new debugstreamengine();
        engine.processpage(pdf.getpage(0));
        assertequals(0.36f, engine.getscalingx());
        assertequals(0.36f, engine.getscalingy());
    }
    

    protected class debugstreamengine extends pdfstreamengine {
        public debugstreamengine() {
            addoperator(new concatenate());
            addoperator(new drawobjectoperator());
            addoperator(new begininlineimageoperator());
            addoperator(new setgraphicsstateparameters());
            addoperator(new save());
            addoperator(new restore());
            addoperator(new setmatrix());
        }

        @override
        protected void processoperator(operator operator, list operands) throws ioexception {
            log.info("processing operator: {}", operator.getname());
        }
        
        protected float getscalingx() {
            return getgraphicsstate().getcurrenttransformationmatrix().getscalex();
        }
        
        protected float getscalingy() {
            return getgraphicsstate().getcurrenttransformationmatrix().getscaley();
        }
    }
assertionfailederror: 
expected :0.36
actual   :1.0

我认为这可能是由 pdfstreamengine.processstream 中的图形堆栈重置引起的。我已经通过维护自己的图形堆栈来解决这个问题,但我想知道我是否错过了更好的解决方案,或者这是否可能是 pdbox 中的错误?

解决方法

根据 mkl 和 kj 的评论,我不再需要确定/恢复缩放。这是通过在创建内容流时添加标志来重置上下文来完成的。这也有助于防止我没有考虑到的其他潜在问题。

添加此标志会在内容流前面添加一个 q 运算符。然后,新的(附加的)流由 q 运算符启动。编译结果为:

预置流

q

原始流

0.36 0 0 0.36 0 0 cm
q
  2200 0 0 1700 0 0 cm
  /im1 do
q

附加流

Q
q
BT
  0 Tr
  /F1 37.75083 Tf
  67 531 Td
  /DeviceRGB cs
  1 0 0 sc
  1 0 0 1 67 531 Tm
  (\000U\000R\000J\000H\000U\000V\000R\000Q) Tj
ET
Q
WPS零基础入门到精通全套教程!
WPS零基础入门到精通全套教程!

全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号