【问题标题】:Cant set parameters PDF generated with itextpdf无法设置使用 itextpdf 生成的参数 PDF
【发布时间】:2020-04-18 09:08:29
【问题描述】:

我正在使用 itextpdf 处理 HTMLPDF,但我遇到了问题。 HTML 有一些参数需要在转换后设置。当我操作 pdf 文件以设置具有垂直水印的图像时,生成 pdf 的 byte[] 具有以下内容:

[(C)-7(ódi)8(g)-3(o)16(:)-7(${)15(C)-7(O)4(D)3(_)5(D)3(O)4(C)-7(}  )20(R)-3(e)-3(v)-4(i)7(s)-3(i)7(ón)15(:)-7(${)15(R)-3(E)10(V)9(_)5(D)3(O)4(C)-7(}  )5(F)-3(e)-3(ch)15(a:)-5(${)15(F)-3(E)10(C)-7(H)19(A)-5(_)5(D)3(O)4(C)-7(})] TJ

这有一些参数,如${COD_DOC},但是当我设置它们时,问题是 图像链接

我的问题是:这些数字是什么意思?因为当我尝试设置字母 P 时它不起作用。

代码:

public Image manipulatePdfTemplate(File pdfTemplate, PdfDocument pdfDoc, Map<String, Object> fileVariables) 
        throws Exception 
{
    log.info("Iniciando el procesamiento del la plantilla pdf");
    PdfPage firstPage = pdfDoc.getFirstPage();

    // Sustituimos las variables por los valores de los parametros
    PdfObject object = firstPage.getPdfObject().get(PdfName.Contents);
    if (object instanceof PdfStream) {
        PdfStream stream = (PdfStream) object;
        byte[] data = stream.getBytes();

        // Método para escribir los bytes del contenido del pdf en un txt
        // writePdfContent(data);

        // Falla el caracter "5" y "X"
        if (fileVariables != null) {
            if (fileVariables.get("COD_DOC") != null && fileVariables.get("REV_DOC") != null
                    && fileVariables.get("FECHA_DOC") != null) {
                String replacedData = new String(data, StandardCharsets.ISO_8859_1)
                        .replace(AppConstant.COD_DOC, " (" + fileVariables.get("COD_DOC") + "  )")
                        .replace(AppConstant.REV_DOC, " (" + fileVariables.get("REV_DOC") + "  )")
                        .replace(AppConstant.FECHA_DOC, " (" + fileVariables.get("FECHA_DOC") + ")");
                stream.setData(replacedData.getBytes(StandardCharsets.ISO_8859_1));
            }
            else if(fileVariables.get("VERTICAL_TEXT") != null) {
                String replacedData = new String(data, StandardCharsets.ISO_8859_1)
                        .replace(AppConstant.VERTICAL_TEXT, "(" + fileVariables.get("VERTICAL_TEXT") + ")");
                stream.setData(replacedData.getBytes(StandardCharsets.ISO_8859_1));
            }
        }
    }

    // Convertimos el resultado a imagen que añadiremos de fondo en cada página del pdf resultante
    PdfFormXObject pageCopy = firstPage.copyAsFormXObject(pdfDoc);
    Image image = new Image(pageCopy);

    return image;
}

设置参数前:

设置参数后:

【问题讨论】:

  • 首先,帮自己一个忙,在转换为 PDF 之前替换您的 ${COD_DOC} 和类似变量。 PDF 不是用于编辑的格式。在您的情况下,您会看到一些原因,请阅读 this answer 了解更多信息。
  • 请不要发布您的帖子的屏幕截图,而是发布实际代码本身。为什么?因为想要给你答案的人,首先想在他们的电脑上运行你的代码。如果我们必须重新输入,那么我们甚至不会费心给您答案。太费劲了。如果我们可以只复制/粘贴,那么您可以让人们更轻松地为您提供答案。

标签: java itext


【解决方案1】:

首先,帮自己一个忙,在转换为 PDF 之前替换您的 ${COD_DOC} 和类似变量。 PDF 不是用于编辑的格式。在您的情况下,您会看到一些原因,请阅读this answer 了解更多信息。

话虽如此,您的实际问题是:

[(C)-7(ódi)8(g)-3(o)16(:)-7(${)15(C)-7(O)4(D)3(_)5(D)3(O)4(C)-7(}  )20(R)-3(e)-3(v)-4(i)7(s)-3(i)7(ón)15(:)-7(${)15(R)-3(E)10(V)9(_)5(D)3(O)4(C)-7(}  )5(F)-3(e)-3(ch)15(a:)-5(${)15(F)-3(E)10(C)-7(H)19(A)-5(_)5(D)3(O)4(C)-7(})] TJ

我的问题是:这些数字是什么意思?

您发布了 TJ 操作。因此,让我们看看 PDF 规范对这个操作是怎么说的:

数组 TJ—— 显示一个或多个文本字符串,允许单独的字形定位。 array 的每个元素应为字符串或数字。如果元素是字符串,则此运算符应显示字符串。如果是数字,则操作者将文本位置调整该数量;也就是说,它应该翻译文本矩阵,Tm。该数字应以文本空间单位的千分之一表示(见 9.4.4,“文本空间细节”)。该数量应从当前水平或垂直坐标中减去,具体取决于书写模式。在默认坐标系中,正调整具有将绘制的下一个字形向左或向下移动给定数量的效果。

(ISO 32000-1,表 109 – 文本显示运算符)

阅读this answer 了解第 9.4.4 节中的详细信息,了解这些数字如何准确地转换文本矩阵 Tm

因此,从本质上讲,这些数字缩短(正)或延长(负)前面和后面字符串的图形之间的差距。

通常,就像您的情况一样,此功能用于实现kerning,即按比例字体调整字符之间的间距,因为如果字符不使用其标准宽度,某些字符组看起来会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2013-08-19
    • 2016-01-18
    • 1970-01-01
    • 2015-10-30
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多