PDFBox를 사용하여 PDF 내용의 크기 조정 결정
在处理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:
@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<cosbase> 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
위 내용은 PDFBox를 사용하여 PDF 내용의 크기 조정 결정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









