Itext7 HTML2PDF - PDF 文件中的图片未旋转

2023-12-31

我有一个 HTML 文件,其中包含一些旋转的图片。当我将 HTML 文件转换为 PDF 文件时,图片不会旋转。看来 EXIF &0112 没有正确应用。

[iText.Html2Pdf.HtmlConverter]::ConvertToPdf($HTMLInputFile,$PDFFileToWrite)

左边是输入的 HTML 文件,右边是创建的 PDF 文件。

我的问题是如何确保图片在创建的 PDF 文件中具有正确的方向。

感谢您的反馈并致以亲切的问候, 威廉·扬


pdfHTML 目前确实不支持 EXIF 数据中的旋转标志(拉取请求welcome https://github.com/itext/i7n-pdfhtml).

作为解决方法,您可以自定义标签工作工厂以插入您自己的实现中以进行处理<img>标签。您可以在那里插入自己的实现来执行图像旋转。我要做的是使用 EXIF 读取旋转标志元数据提取器 https://github.com/drewnoakes/metadata-extractor-dotnet库并应用附加属性,即Image#setRotationAngle()。另一种选择可能是只读取图像和旋转标志,然后旋转图像并替换图像内容(这样我们就可以用其精确副本替换原始图像,除非不使用旋转标志,即如果需要则旋转图像)在删除标志之前),例如通过将 Base64 编码的值放入src属性。

这里我们创建一个自定义标签工人工厂:

private static class CustomTagWorkerFactory extends DefaultTagWorkerFactory {
    @Override
    public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
        if ("img".equals(tag.name())) {
            return new RotationAwareImgTagWorker(tag, context);
        }
        return super.getCustomTagWorker(tag, context);
    }
}

接下来是最重要的部分 - 解析图像并将我们的属性应用到自定义标记工作器中:

private static class RotationAwareImgTagWorker extends ImgTagWorker {
    private int rotation = 0;

    public RotationAwareImgTagWorker(IElementNode element,
            ProcessorContext context) {
        super(element, context);
    }

    @Override
    public void processEnd(IElementNode element, ProcessorContext context) {
        super.processEnd(element, context);
        String src = element.getAttribute(AttributeConstants.SRC);
        PdfXObject imageXObject = context.getResourceResolver().retrieveImageExtended(src);
        if (imageXObject instanceof PdfImageXObject && ((PdfImageXObject) imageXObject).identifyImageType() == ImageType.JPEG) {
            Metadata metadata = null;
            try {
                metadata = ImageMetadataReader
                        .readMetadata(new ByteArrayInputStream(((PdfImageXObject) imageXObject).getImageBytes()));
                ExifIFD0Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
                if (directory.containsTag(ExifSubIFDDirectory.TAG_ORIENTATION)) {
                    int orientation = directory.getInt(ExifSubIFDDirectory.TAG_ORIENTATION);
                    if (orientation != 0) {
                        switch (orientation) {
                            case 1:
                                break;
                            case 6:
                                this.rotation = 270;
                                break;
                            default:
                                throw new UnsupportedOperationException(); // TODO
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace(); // TODO
            }
        }
    }

    @Override
    public IPropertyContainer getElementResult() {
        IPropertyContainer baseResult = super.getElementResult();
        if (baseResult instanceof Image) {
            ((Image) baseResult).setRotationAngle(Math.PI * rotation / 180);
        }
        return baseResult;
    }
}

为了把它们放在一起,我们需要利用ConverterProperties:

ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new CustomTagWorkerFactory());
HtmlConverter.convertToPdf(new File(sourceHtml), new File(outPdf), properties);

这是视觉结果:

如果您想使用 PowerShell,那么您可能应该围绕 iText 构建自己的小型自定义库并调用该库,而不是在 PowerShell 中实现上述选项。请注意,答案是用 Java 编写的,但移植到 .NET 应该是大写一些字母名称等的小问题,并且metadata-extractor与 iText 类似,该库可在 Java 和 .NET 上使用。

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

Itext7 HTML2PDF - PDF 文件中的图片未旋转 的相关文章

随机推荐

  • 自定义 UISlider:拖动到外部时避免更新

    我对 iPhone 开发还很陌生 我正在构建我的第一个应用程序 在我的一个视图控制器中 我构建了一个 customSlider 它应该充当本机 滑动解锁 滑块 我现在的疑问是如何实现 拖到外面 的行为 如前所述 我希望它与本机滑块完全相同
  • 通过复制 TesserCap 的斩波滤波器去除验证码图像的背景噪声

    我有一个验证码图像 如下所示 使用名为的实用程序泰瑟帽 http www mcafee com us downloads free tools tessercap aspx通过 McAfee 我可以对图像应用 斩波 滤镜 在运行之前 我确保
  • 如何在后台保持VOIP套接字连接?

    我的应用程序要求 由于某些原因 我应该维护一个套接字连接以触发服务器推送上的本地通知 而不使用推送通知 APN 所以我使用iPhone的VOIP后台功能来维持套接字连接 1 我已经为 VOIP 配置了一个流 以便保持套接字连接在后台运行 那
  • 为sybase设置jdbc连接池

    我目前正在为每个 jsp 或 servlet 创建一个 jdbc 连接 如何为sybase创建jdbc连接池 这样就可以避免为每个jsp servlet创建连接 并且jsp servlet可以直接获取连接并与数据库进行事务处理 任何人都可以
  • 检查图像是否不存在然后隐藏 div

    如果 div 中有图像 则隐藏该 div 但如果图像确实存在 那么我需要保持 div 可见 但它不起作用 这是我的代码 HTML table tbody tr td div div p PRODUCT FEATURES p div img
  • 如何为VS2010重新安装MVC 2工具?

    我不小心卸载了 Visual Studio 2010 的 Asp Net MVC 2 Tools 如何重新安装它 MVC2 下载似乎只包含 VS2008 工具 我在 google 上搜索的所有内容都表明 MVC 2 包含在 VS2010 中
  • 每当我尝试粘贴时,Excel VBA 粘贴特殊方法都会失败

    大家好 我对 vba 相当陌生 我正在尝试捕获工作表上的所有 ctrl v 事件 并将剪贴板上的所有内容粘贴到当前选定的单元格中 大多数时候 我想要复制的是来自 Firefox 或记事本的文本 E I 客户的姓名或电话号码位于我们的网站上
  • 当质量门失败时,如何使 Maven 构建失败?

    早些时候我使用sonar maven plugin version 3 2然后 当声纳质量门失败时 构建也会失败 现在我正在使用sonar maven plugin version 3 7 0 1746 但事实并非如此 即使质量门失败 ma
  • Android - 如何在具有特定位置、缩放级别和标记的 Android 应用程序中启动 Google 地图意图

    地图意图不适用于特定缩放级别以及自定义标记 float lat 40 714728f float lng 73 998672f String maplLabel ABC Label final Intent intent new Inten
  • 为什么 dataTokens 在 Route 中?

    context MapRoute authorized credit card owners ownerKey authorizedcreditcard action new controller authorizedcreditcard
  • 实体框架按日期分组并返回新类

    我正在使用 NET 和实体框架 我想按日期对表格进行分组 不包含时间部分 我有课 public sealed class QueryItem public int Year get set public int Month get set
  • Python 3:如何让“else”语句仅在“if”语句都不为真时才适用?

    抱歉 这里是初学者 尝试使该程序扫描某个字母组合 如果没有找到任何字母组合 则返回 else 语句 但是 我不知道如何仅当所有 if 语句返回 False 时才应用 else 语句 这是我的代码 class color BOLD 033 1
  • 正确访问存在重复索引值的切片

    我有一个带有索引的数据框 有时包含具有相同索引值的行 现在我想对该数据帧进行切片并根据行索引设置值 考虑以下示例 import pandas as pd df pd DataFrame index 1 2 2 3 values 10 20
  • 在 Selenium python 中通过 xpath 模式查找元素

    我正在使用 selenium python 和 lettuce 来测试 django 应用程序 以下模式中有许多具有 xpath 的元素 我不知道文档中存在多少个这些元素 id accordion note 1 id accordion n
  • “查找最近位置”如何运作?

    如今 大多数餐馆和其他企业都拥有 查找地点 http www fedex com Dropoff start 他们网站上的功能列出了给定地址 邮政编码的最近位置 这是如何实现的 将邮政编码与数据库进行匹配是一种简单的 无需思考的方法 但可能
  • C++17 中有 typeid 的反函数吗?

    C 17 是否提供了一种从 typeid 获取类型的方法 或者工厂模式仍然是唯一的方法 type info是运行时值 其确切内容只能通过运行时执行来确定 C 是一种静态类型语言 在编译时 类型一切必须被知道 像这样 type info基于具
  • 通过 spring-data 迭代 MongoDB 中的大型集合

    Friends 我通过 spring data 在 java 项目中使用 MongoDB 我使用存储库接口来访问集合中的数据 对于某些处理 我需要迭代集合的所有元素 我可以使用存储库的 fetchAll 方法 但它总是返回 ArrayLis
  • Mule OAuth2 使用客户端凭证作为 grant_type

    我的要求是使用OAuth2的client credentials grant type来获取Mule中的访问令牌 我想实现一个支持 OAuth 的自定义连接器 我无法使用以下配置来实现它
  • 电脑锁定时如何发送电子邮件?

    我想使用 Excel VBA 发送 Outlook 电子邮件 代码Sendupdate手动运行时有效 我的第二个宏StartTimer旨在当我不在办公桌前时在设定时间执行上述操作 当计算机被锁定时 电子邮件不会发送 当我回到办公桌前时 电子
  • Itext7 HTML2PDF - PDF 文件中的图片未旋转

    我有一个 HTML 文件 其中包含一些旋转的图片 当我将 HTML 文件转换为 PDF 文件时 图片不会旋转 看来 EXIF 0112 没有正确应用 iText Html2Pdf HtmlConverter ConvertToPdf HTM