PDFBox - 将图像转换为 PDF,PDF 分辨率

2024-01-05

我正在使用 PDFBox v2 将 jpg 图像转换为 PDF。 JPG 图像已在文件系统中,因此我只需将其拾取并将其转换为 PDF。下面是我的代码

public void convertImgToPDF(String imagePath, String fileName, String destDir) throws IOException {
        PDDocument document = new PDDocument();
        InputStream in = new FileInputStream(imagePath);
        BufferedImage bimg = ImageIO.read(in);
        float width = bimg.getWidth();
        float height = bimg.getHeight();
        PDPage page = new PDPage(new PDRectangle(width, height));
        document.addPage(page);
        PDImageXObject img = PDImageXObject.createFromFile(imagePath, document);
        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.drawImage(img, 0, 0);
        contentStream.close();
        in.close();
        document.save(destDir + "/" + fileName + ".pdf");
        document.close();
    }

这段代码可以很好地完成转换。但是,我在转换后的 PDF 中观察到以下内容

  1. 当我打开转换后的 PDF 时,它打开速度非常慢(在 Acrobat reader 中)。看起来 PDF 是逐像素打开的。如果我打开任何其他 PDF,它都可以正常打开。
  2. 对于转换后的 PDF,Acrobat Reader 中的默认大小显示为较小的值(例如 15% 或 24%,附有屏幕截图)。尽管它覆盖了 100% 的屏幕(15% 意味着我看到的图像要小得多,但事实并非如此)。当我将尺寸更改为 100% 时,我看到一个高度模糊的图像,它比实际图像大得多,我必须向左/右和上/下滚动才能看到完整的图像。

这两个观察结果让我觉得,出于某种原因,生成的 PDF 的分辨率比应有的要高得多。这是一个公平的说法吗?如果是这样,我该如何纠正这个问题?

EDIT附上正在转换为 PDF 的 JPG 图像。当我打开 PDF 时,它显示的大小为 25.9%。这张图片是在 iPad 上点击的。


有一个超载的drawImage()方法来做到这一点

contentStream.drawImage(PDImageXObject, float x, float y)
contentStream.drawImage(PDImageXObject, float x, float y, float height, float width)

通过指定明确的宽度和高度contentStream.drawImage(),这是可以实现的。例如,如果您想将图像显示为小 4 倍,但仍保留相同的分辨率,可以使用

scaleDownRatio = 0.25;
pageSize = PDRectangle.A4;

# this will draw image at bottom left corner
PDImageXObject pageImageXObject = LosslessFactory.createFromImage(document, bitmap);
contentStream.drawImage(pageImageXObject, 0, 0, bitmap.getWidth() * ratio, bitmap.getHeight() * ratio)

# to center it you can use something like
contentStream.drawImage(pageImageXObject, (pageSize.getWidth() - bitmap.getWidth() * ratio) / 2, (pageSize.getHeight() - bitmap.getHeight() * ratio) / 2, bitmap.getWidth() * ratio, bitmap.getHeight() * ratio)

注意:在您的情况下,即使将图像缩放到四分之一大小,图像仍然不适合;您可以通过以下方式获得比例因子

float widthRatio = bitmap.getWidth() / pageSize.getWidth();
float heightRatio = bitmap.getHeight() / pageSize.getHeight();
scaleDownRatio = (widthRatio<heightRatio)? widthratio:heightRatio;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDFBox - 将图像转换为 PDF,PDF 分辨率 的相关文章

  • OpenJDK 11 问题 - 客户端在上次 UNWRAP 之前完成握手

    我正在将代码库从 Oracle Java 1 8 0 131 迁移到 OpenJDK 11 0 1 我们有实现 nio ssl 套接字通道的代码 在 Java 8 中 客户端 服务器握手工作正常 在 Java 11 中 客户端在解包来自服务
  • 如何找出导致 poi 损坏 xlsx / xlsm 文件的原因

    我遇到的问题是 Apache POI 仅通过读取和写入就 损坏 了 xlsm xlsx 文件 例如使用以下代码 public class Snippet public static void main String args throws
  • 添加@Named时@SessionScoped不起作用

    考虑以下支持 bean import javax faces bean ManagedBean import javax faces bean SessionScoped ManagedBean SessionScoped public c
  • setSize() 不起作用?

    我有一个程序 需要两个按钮 一个是常规按钮 另一个具有根据鼠标悬停而变化的图片 目前 由于图片很大 JButton自定义也很大 我可以更改自定义的大小并保持图像 和翻转图像 成比例吗 我尝试过 setSize 但它没有任何作用 对于任何反馈
  • Android 上 WebRTC 的自定义视频源

    Overview 我想使用自定义视频源通过 WebRTC Android 实现来直播视频 如果我理解正确的话 现有的实现仅支持 Android 手机上的前置和后置摄像头 以下类与此场景相关 Camera1Enumerator java ht
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • json文件格式的升级路径

    我们将 Java 应用程序的用户首选项存储在 JSON 文件中 使用Jackson http jackson codehaus org 随着我们继续开发该应用程序 我们将添加首选项 重命名首选项并删除过时的首选项 当用户将应用程序升级到下一
  • 如何在android中播放内部和外部SD卡中的mp3文件?

    我正在开发一个 mp3 播放器应用程序 它可以播放内部 SD 卡内任何位置的 mp3 文件 我使用以下代码来获取内部存储中存在的 mp3 文件 ArrayList
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • Spring Boot 1.4:Liquibase完成后的执行方法

    我有一个基于 Spring Boot 1 4 0 的项目 该项目使用 Liquibase liquibase 完成后是否可以执行方法 像 Bean 后处理器之类的东西 我想要做的是当应用程序在开发模式下启动时向我的数据库添加一些数据 在开发
  • 我可以直接在 Maven 中使用 GitHub 项目吗?

    我有兴趣使用GitHub 上的项目 https github com toelen spymemcached jcache作为我的项目中的依赖项 GitHub 项目有一个pom文件 我可以修改我的pom文件来使用这个项目 如果是这样 怎么办
  • 更改 WireMock __files 目录

    来自docs http wiremock org docs stubbing 要从文件中读取正文内容 请将文件放在 files 下 目录 默认情况下 这应该位于 src test resources 下 从 JUnit 规则运行时 当独立运
  • Windows:如何获取所有可见窗口的列表?

    无论如何都要使用相关技术重新标记 我不知道它们是什么 稍后我可能会提出更详细的问题 关于具体细节 但现在我正在尝试掌握 大局 我正在寻找一种方法来枚举 Windows 上的 真实可见窗口 我所说的 真正可见的窗口 就是指 用户所说的 窗口
  • 无法实例化类对象的类型 (Java)

    这是我收到错误的代码 在 new 之后的第二个 Killer 处 String classes new String 5 kills 0 Brian Moser kills 1 James Doakes kills 2 Lila Tourn
  • 从 Java/Spring 检索 RabbitMQ 队列中未确认消息的数量

    有没有办法返回未确认的消息数 我正在使用此代码来获取队列中的消息数 DeclareOk declareOk amqpAdmin getRabbitTemplate execute new ChannelCallback
  • 是否可以将自定义清单添加到 Netbeans 6.7.1 中编译的 Java 库中?

    我尝试添加manifest file src dir manifest mf到project properties 但是查看build impl xml我发现manifest available通常伴随着main class条件 所以这让我
  • 部署到 Glassfish 4.1 时 URL 模式无效

    如果用户已经通过身份验证 我有一个网络过滤器可以从登录和索引页面重定向 最初我有一个无效的 URL 模式 我修复了无效模式并尝试重新部署以接收以下内容 java lang IllegalArgumentException Invalid U
  • 如何使用 log4j2.xml 配置 hibernate 日志记录?

    我最近切换到 Apache log4j2 但仍然找不到使用 log4j2 xml 配置 hibernate 日志记录的方法 因为我找不到解决此问题的方法 所以我仍然显式使用 log4j properties 文件进行休眠 这不是最好的解决方
  • 有没有办法让 SonarQube 只警告不完整的 Switch 语句?

    使用 Java SonarQube 抱怨枚举值上的 switch 语句没有default case 给出的推理是 最终默认条款的要求是防御性编程 该条款应采取适当的行动 或包含 关于为什么不采取行动的适当评论 当开关盖上时 枚举的所有当前值
  • 与 System.in.read() 一起使用的文件结尾/流键盘组合是什么

    如果这个小问题已经得到解答 我深表歉意 我无法在SO找到它 使用以下 Java 简单代码从 IDE 控制台读取行 Windows 7 和 Eclipse Kepler int v try while v System in read 1 S

随机推荐

  • 从 Webpack 的 require.context 中排除文件

    我正在尝试加入require contextWebpack 的所有文件应该由我的伊斯坦布尔记者报道 我想包含 需要以下所有文件app那些没有 test js扩大 internals testing test bundler js const
  • 如何使用 std::chrono::duration 作为模板参数?

    我有一个模板类 类似于 template lt typename T size t Seconds gt class MyClass 现在 我想将 Seconds 更改为持续时间 以便该类可以参数化std chrono duration 例
  • Keras 文本预处理 - 将 Tokenizer 对象保存到文件中以进行评分

    我按照以下步骤 大致 使用 Keras 库训练了一个情感分类器模型 使用 Tokenizer 对象 类将文本语料库转换为序列 使用 model fit 方法构建模型 评估这个模型 现在 为了使用此模型进行评分 我可以将模型保存到文件中并从文
  • 设置 Sentry.io 时出现问题。没有任何内容发送到哨兵面板

    我将在我正在开发的 Android 项目中使用 Sentry 我的公司正在使用自托管 Sentry 版本 9 0 0 我跟着Sentry io 安装指南 https docs sentry io clients java modules a
  • 插入sqlite flutter 不冻结界面

    我正在尝试使用 flutter 在 sqlite 内存数据库中插入大量行 大约 12k 或更多 我从 API 获取数据并使用计算函数来处理来自 Json 的数据 现在我需要将这些数据添加到内存中的数据库中 为此我使用批量事务 batchIn
  • Watir webdriver Errno::ECONNREFUSED: 无法建立连接,因为目标计算机主动拒绝连接。 - 连接(2)

    Updated 我正在运行下面的代码来执行示例测试用例 Windows 7 Watir 3 0 0 Watir webdriver 0 6 1 require watir webdriver require test unit class
  • spring - hibernate 5 命名策略配置

    我正在使用 postgresql 数据库和 spring hibernate 框架编写应用程序 我将spring框架从4 1 5 RELEASE升级到4 2 0 RELEASE版本 并将hibernate框架从4 3 7 Final升级到5
  • 视图中的 CodeIgniter 助手

    这是一个很好的解决方法吗 是否可以在 CodeIgniter 的视图中使用辅助类 我遇到一种情况 我必须使用正则表达式从文本字符串中提取并生成匹配的输出 我不想直接在视图中执行此操作 并且我想为此使用一个助手 application vie
  • 使用 jquery 删除所有 href 链接

    我试图从已解析的站点中删除所有链接 然后该站点已删除一个 div 并将其放置在主代码中 问题是我试图删除提取的 div 中的所有 href 链接 但无法到达任何地方 我尝试过使用 CSS 并且可以工作 但只能在 Chrome 中使用 而且我
  • 在 subversion 中创建一个“标签”,指示下一个版本中应包含哪些文件

    我使用 StarTeam 进行版本控制已经有一段时间了 但现在正在转向 Subversion 我一直在读颠覆书 http svnbook red bean com StarTeam 似乎有一个 Subversion 没有的主要功能 标签的概
  • 从 Konvajs 中的空白区域拖动来拖动变压器的最佳方法是什么?

    我目前正在关注本指南 https konvajs org docs select and transform Basic demo html选择舞台中的形状并将它们放入变压器中 如果可能的话 我想拖动整个 Transformer 及其所有内
  • 仅使用 css 更改“选项”的高度

    例如 在代码中 选项 太低 我想仅使用css 无javascript 将其提高
  • 获取 -bash:mvn:找不到命令

    我尝试在 profile 文件中设置 Maven PATH 并在终端 Mac OSX 中使用导出命令 但是 在运行 mvn 命令时 得到 bash mvn command not find 请帮忙 你具体设置了什么 你是否像这样设置 PAT
  • 表单提交按钮在 Google Chrome 中不起作用(jQuery Validate)

    我在演示页面上使用 jQuery Validate 插件 由于某种原因 提交 按钮在 Google Chrome 中不起作用 我怀疑这与自动填充功能有关 但我不确定 这几天一直在为这个问题苦苦挣扎 这是链接 联系表 http julianj
  • 如何在 C++ 中 sleep() 线程

    我正在编写一个简单的程序 它创建一个线程 休眠 20 秒 然后终止该线程 下面的代码可以编译 但无法休眠并在运行时崩溃 在所有 cout 行运行之后 我不确定出了什么问题 我已尽力模仿该主题的其他线程 哈 我应该使用不同的方法吗 使用Win
  • 访问 Visual Studio 2017 的私有注册表配置单元

    Visual Studio 使用私有注册表配置单元而不是 污染 系统注册表 通常可以在如下位置找到 C Users Abx AppData Local Microsoft VisualStudio 15 0 4b0ba1c0 private
  • Firestore 连接执行线程时出现问题

    首先 如果标题有误导性 我想道歉 英语不是我的母语 我不知道如何命名这篇文章 现在的问题是 我有一个 Activity 显示 Firebase 项目中存储的有关用户的数据 数据在 Firebase 用户 显示名称 电子邮件和个人资料图片 和
  • 固定容器内的随机移动

    我正在寻找创建一些可以在固定 div 容器内随机移动的东西 我喜欢在这个例子中物体移动的方式 我发现搜索这个网站 http jsfiddle net Xw29r 15 http jsfiddle net Xw29r 15 jsfiddle上
  • PHP:URL重写

    我想知道如何在没有 php 扩展名的情况下分页 url 例如 这是我的网站 http mywebsite com http mywebsite com 现在 无论何时我从主页单击任何画廊 它都会转到页面 gallery php 其中包含画廊
  • PDFBox - 将图像转换为 PDF,PDF 分辨率

    我正在使用 PDFBox v2 将 jpg 图像转换为 PDF JPG 图像已在文件系统中 因此我只需将其拾取并将其转换为 PDF 下面是我的代码 public void convertImgToPDF String imagePath S