无法使用 itext7 使用 Java 语言在仅 skia 生成的 pdf 上放置印章(显示倒置印章)

Posted

技术标签:

【中文标题】无法使用 itext7 使用 Java 语言在仅 skia 生成的 pdf 上放置印章(显示倒置印章)【英文标题】:unable to put stamp using itext7 using Java lanaguage on only skia generated pdf (shows inverted stamp) 【发布时间】:2018-07-05 05:46:48 【问题描述】:

我无法使用 itext7 使用 Java 语言在仅 skia 生成的 pdf 上添加图章(skia 是 google 使用的 pdf 库;如果有人研究过 google docs-> 点击打印 -> 另存为 Pdf )。它盖章不正确;如果我在 pdf 页面的左上角标记,那么它会在左下角标记并显示(倒置镜像)图像和(倒置镜像)文本。对于所有其他 pdf,它会给出正确的标记。 似乎skia生成的pdf缺少元数据。

【问题讨论】:

向我们展示您的代码。并非所有 PDF 的原点都位于坐标 ( x = 0; y = 0 )。也许你没有考虑到这一点。另外:当印章倒置时,看起来好像发生了一些变化。 ... 也请分享一个示例文档。按照您的说明生成 PDF 的结果可能取决于一个人的区域设置和其他帐户设置... 页面大小、页面方向、转换矩阵:这些都与元数据无关(与 Info 字典或 XMP 元数据无关)。因此,您的评论“似乎由 skia 生成的 pdf 缺少元数据”很奇怪。 【参考方案1】:

由于您没有共享任何代码,也没有共享任何文档,因此我从 Google 文档创建了一个 PDF 文档,并使用我在回答 Itextsharp 7 - Scaled and Centered Image as watermark 问题时编写的代码在中心添加了水印。

结果如下所示:

正如您在文档属性中看到的,原始文档是使用 Skia/PDF m67 创建的;使用 iText® 7.1.3 修改。

你需要在左上角添加一个水印,所以我修改了这样的代码:

public void createPdf(String src, String dest) throws IOException 
    PdfDocument pdfDoc = new PdfDocument(
            new PdfReader(src), new PdfWriter(dest));
    Document document = new Document(pdfDoc);
    PdfCanvas over;
    PdfExtGState gs1 = new PdfExtGState();
    gs1.setFillOpacity(0.5f);
    int n = pdfDoc.getNumberOfPages();
    Rectangle pagesize;
    ImageData img = ImageDataFactory.create(IMG);
    float iW = img.getWidth();
    float iH = img.getHeight();
    float x, y;

    for (int i = 1; i <= n; i++)
    
        PdfPage pdfPage = pdfDoc.getPage(i);
        pagesize = pdfPage.getPageSize();

        x = pagesize.getLeft();
        y = pagesize.getTop() - iH;

        over = new PdfCanvas(pdfDoc.getPage(i));

        over.saveState();
        over.setExtGState(gs1);

        over.addImage(img, iW, 0, 0, iH, x, y);

        over.restoreState();
    
    document.close();
    pdfDoc.close();

结果如下:

图像未镜像;它位于页面的左上角。简而言之:使用 Skia/PDF m67 创建的 PDF 似乎没有任何问题。

【讨论】:

我建议使用混合模式 Darken 而不是 FillOpacity 结合已经变亮的位图;这将防止图像下方的文本出现褪色的外观。 我很懒惰。我从今天早些时候给出的答案中回收了代码。 啊,非常环保... ;)

以上是关于无法使用 itext7 使用 Java 语言在仅 skia 生成的 pdf 上放置印章(显示倒置印章)的主要内容,如果未能解决你的问题,请参考以下文章

CSS背景属性在使用java的pdfHTML iText7中不起作用

Java Hibernate LazyInitializationException 仅在仅使用 JUnit 运行时出现

Keycloak 问题无法在仅承载模式下交换代码以获得授权

项目结构 iText7

使用 keycloak-nodejs-connect 时出错 - “无法在仅承载模式下交换代码以获取授权”

项目结构iText7