首页 文章

iTextSharp PdfStamper根据最新矩阵将条形码放入现有PDF中

提问于
浏览
0

我有一个现有的PDF,它将此作为最后一个矩阵转换:

q 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm(旋转45度,有些过渡)

我使用PdfStamper将图像插入OverContent(使用方法GetOverContent) . 问题是,最后一次转换设置了45度旋转,因此条形码也会旋转 . 我无法重置此矩阵 . 我甚至无法获得最后的转换矩阵 .

我已经尝试过PdfReaderContentParser来获取所有矩阵并将它们相乘,这样我就可以得到倒置矩阵来使用带有这个反转矩阵的ConcatCTM再次生成Identity矩阵,但解析器不会返回所有矩阵 . 它只能获取图像的矩阵,而不能获取文本的矩阵 .

我已经花了几个小时尝试不同的解决方案(创建模板,图层......),没有工作,一切都根据最后一个矩阵旋转 .

如何将矩阵重置回现有PDF中的标识?因此,PdfStamper插入的条形码不会旋转45度 .

请求不建议为条形码图像设置-45度旋转,它不会解决任何问题,因为PDF可以有或没有最后的旋转矩阵 .

我真的需要将转换矩阵重置为OverContent的单位矩阵 .

非常感谢你们...

编辑:这是完整的内容:

q 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm

问BT 141.73 274.96 Td 5 Tr(某些文字)Tj ET

Q

0.57瓦

BT / F1 20.00 Tf ET

q 1.00000 0.00000 0.00000 1.00000 155.91 246.61 cm 1 0 0 1 -155.91 -246.61 cm

问BT 155.91 246.61 Td 5 Tr(某些文字)Tj ET

Q

1 回答

  • 1

    您的PDF有语法问题 . 我看到"save state"运算符 q ,但我没有看到"restore state"运算符 Q .

    代替:

    q 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm
    

    你应该有:

    q 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm Q
    

    好吧,实际上,如果您在共享的PDF语法后面没有任何其他内容,则应该删除完整的代码段,因为引入坐标系转换没有意义,然后对其执行任何操作都没有意义 .

    如果要为此特定PDF修复此问题,可以执行以下操作:

    overContent.SetLiteral(" Q ");
    

    这将恢复图形状态(并在您放置时“重置矩阵”) . 不要对所有PDF执行此操作,仅针对此错误的PDF .

    Update:

    您说代码的语法如下所示:

    q 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm
    q BT 141.73 274.96 Td 5 Tr (some text) Tj ET
    Q
    0.57 w
    BT /F1 20.00 Tf ET
    q 1.00000 0.00000 0.00000 1.00000 155.91 246.61 cm 1 0 0 1 -155.91 -246.61 cm
    q BT 155.91 246.61 Td 5 Tr (some text) Tj ET
    Q
    

    这段代码错了 . 创建此PDF的人使用的是蹩脚的工具,或者他以非常糟糕的方式使用了一个好工具 . 正确的语法是:

    q 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm
    BT 141.73 274.96 Td 5 Tr (some text) Tj ET
    Q
    q 0.57 w
    BT /F1 20.00 Tf ET
    q 1.00000 0.00000 0.00000 1.00000 155.91 246.61 cm 1 0 0 1 -155.91 -246.61 cm
    BT 155.91 246.61 Td 5 Tr (some text) Tj ET
    Q
    Q
    

    您可以像这样解决问题:

    q 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm
    q BT 141.73 274.96 Td 5 Tr (some text) Tj ET
    Q
    0.57 w
    BT /F1 20.00 Tf ET
    q 1.00000 0.00000 0.00000 1.00000 155.91 246.61 cm 1 0 0 1 -155.91 -246.61 cm
    q BT 155.91 246.61 Td 5 Tr (some text) Tj ET
    Q
    Q
    Q
    

    现在 q / Q 序列是 balancer 的 . 我正在添加数字以显示 q 与哪个 Q 对应:

    q[1] 0.70711 0.70711 -0.70711 0.70711 141.73 274.96 cm 1 0 0 1 -141.73 -274.96 cm
    q[2] BT 141.73 274.96 Td 5 Tr (some text) Tj ET
    Q[2]
    0.57 w
    BT /F1 20.00 Tf ET
    q[3] 1.00000 0.00000 0.00000 1.00000 155.91 246.61 cm 1 0 0 1 -155.91 -246.61 cm
    q[4] BT 155.91 246.61 Td 5 Tr (some text) Tj ET
    Q[4]
    Q[3]
    Q[1]
    

    这个语法是错误的(显然),但数字显示为什么缺少两个 Q 语句 .

相关问题