是的,我知道这是重复的问题。但是我仍然需要了解很多有关水平解析的知识。我希望在这里得到完整明确的答案。

我有一些示例内容流,如下所示:

范例1:

BT
/F33 20.665 Tf
72 633.8289 Td
[(Chapter)-375(12)]TJ
/F33 24.78709 Tf
0 51.30099 Td
[(P)31(arametric)-375(and)-375(P)32(olar)-375(Curv)31(es)]TJ


范例2:

BT
/C0_1 14 Tf
39.812999 681.73999 Td
[(\000"\000M\000U\000I\000P\000V\000H\000I\000\001)-82(\000$\000B\000S\000P\000V\000T\000F\000M\000\0001)-82(\000X\000B\000T\000\001)-82.07099........]TJ


水平解析(tx)的公式为
    java - 探索pdf中的水平解析TJ(对tx公式的详细了解)?-LMLPHP

现在我想用example1代替值:

W0 =?(here mkl提到w0表示宽度数组中各个字符的宽度。如何获取长度。上述3个示例的不同值是什么?如何从现有的pdf中获取。如何获取CMAP的字符宽度。)

Tj = TJ数组中的数字。

Tfs =使用图形状态中的字体大小,它是相关Tf操作中的字体大小参数,例如10。

Tc =使用图形状态中的值,该值是相关Tc或“操作”中的参数。

Tw =使用0或(在单字节字符代码为32的情况下)来自图形状态的值,该值是来自相关Tw或“操作的参数。

Th =使用图形状态中的值,该值是相关Tz操作的参数除以100。

请为每个示例分步编写解决方案,并在可能的情况下,说明所有正在使用的TJ数组类型(我们可能在内容流中看到的类型)PDF。我从PDF32000_2008(9.4.4 Text Space Details)中阅读了这个概念,但仍然感到困惑。您可以在下面的链接中找到实际的pdf文件

Example 1 file

Example2 file

最佳答案

听起来您最想知道的是从哪里检索宽度(w0值)。

这实际上很容易,宽度数组位于PDF字体对象中!如果是简单字体,则宽度值在Widths数组中。唯一的例外是标准的14种字体。对于他们来说,PDF处理器应该知道字形的宽度。对于CID字体,W数组中的宽度值默认为DW值默认为1000。

在Type 1,TrueType和CID字体的情况下,宽度的度量单位为1000个单位对应于文本空间中的1个单位。

对于Type 3字体,这些宽度应在FontMatrix指定的字形空间中进行解释;但需要注意的是,有一种常见的做法是按照1000个单位的字形坐标系来定义字形,在这种情况下,字形矩阵为[0.001 0 0 0.001 0 0],这与1000:1的比例相同以上。

你的第一个例子



/F33 20.665 Tf
72 633.8289 Td
[(Chapter)-375(12)]TJ


在这里,在第一条指令中选择字体大小为20.665的字体F33。该字体在对象21中定义:

24 0 obj
[656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500]
endobj
21 0 obj
<<
/BaseFont /HLFPHX+CMBX12
/FirstChar 11
/FontDescriptor 22 0 R
/LastChar 122
/Subtype /Type1
/Type /Font
/Widths 24 0 R
>>


因此,代码为11的字形的宽度为.6562,代码为12的字形的宽度为.625单位,依此类推。

因此,在开始时,文本矩阵和文本行矩阵指向(0,0)。在72 633.8289 Td之后,它们指向(72,633.8289)。这是绘制“ C”的地方。

绘图“ C”使文本矩阵指向的位置前进了一个tx值

((w0-Tj / 1000)×Tfs + Tc + Tw)* Th

我们在指令参数中看到的'C'实际上是字节0x43 =67。因此,在Widths数组中,我们在索引56(基于0的数字)812.5处找到1000:1处的w0值。 'C'之后没有数字参数,因此Tj为0。Tfs为20.665。 Tc和Tw均为0。Th为1。

因此,tx为((.8125-0)×20.665 + 0 + 0)×1 = 16.7903125,图形'C'将文本矩阵指向的位置前进到(88.7903125,633.8289)。这是绘制“ h”的地方。

类似地,图形'h'使位置前进tx =((.625-0)×20.665 + 0 + 0)×1 = 12.915625至(101.7059375,633.8289)。这是绘制“ a”的地方。

图纸'a'使位置前进tx =((.5469-0)×20.665 + 0 + 0)×1 = 11.3016885至(113.007626,633.8289)。这是绘制“ p”的地方。

图纸'p'使位置前进tx =((.625-0)×20.665 + 0 + 0)×1 = 12.915625至(125.923251,633.8289)。这是绘制“ t”的地方。

绘图't'使位置前进tx =((.4375-0)×20.665 + 0 + 0)×1 = 9.0409375至(134.9641885,633.8289)。这是绘制“ e”的地方。

图纸'e'使位置前进tx =((.5133-0)×20.665 + 0 + 0)×1 = 10.6073445至(145.571533,633.8289)。这是绘制“ r”的地方。

考虑数字参数-375的图形'r'使位置前进tx =((.4595-(-375/1000))×20.665 + 0 + 0)×1 = 17.2449425至(162.8164755,633.8289)。这是绘制“ 1”的地方。

图纸'1'使位置前进tx =((.5625-0)×20.665 + 0 + 0)×1 = 11.6240625至(174.440538,633.8289)。这是绘制“ 2”的地方。

图纸'2'使位置前进tx =((.5625-0)×20.665 + 0 + 0)×1 = 11.6240625至(186.0646005,633.8289)。

此后,指令/F33 24.78709 Tf将文本字体大小更改为24.78709,指令0 51.30099 Td将文本行矩阵和文本矩阵的位置前进到(72,582.52791)。这是绘制“ P”的地方。

考虑数字参数31的图形'P'使位置前进tx =((.7685-(31/1000))×24.78709 + 0 + 0)×1 = 18.280478875至(90.280478875,582.52791)。这是绘制“ a”的地方。

...

你的第二个例子

/C0_1 14 Tf
39.812999 681.73999 Td
[(\000"\000M\000U\000I\000P\000V\000H\000I\000\001)-82(\000$\000B\000S\000P\000V\000T\000F\000M\000\001)-82(\000X\000B\000T\000\001)-82.07099........]TJ


此处选择的字体C0_1的字体大小为14。此字体是复合字体,其后代字体在对象24中定义:

24 0 obj
<<
/BaseFont /NFAHTB+MinionPro-Regular
/CIDSystemInfo 30 0 R
/DW 1000
/FontDescriptor 31 0 R
/Subtype /CIDFontType0
/Type /Font
/W [0 [500 227 276 318]
 4 5 480 6 [756 711 223]
 9 10 346
11 [404 580 228 356 228 331]
 17 26 480 27 28 228 29 [552 580 552 379 753 691 588 665 735 568
529 715 766 341 329 673 538 891 743 747
563 745 621 474 617 736 703 971 654 634
603 345 333 345 566 500 224 439 508 423
528 425 296 468 534 268 256 496 253 819
547 510 524 511 371 367 305 531 463 685
472 459 420 347 263 347 580 276]
97 98 480 99 [159]
 100 101 480 102 [477 480 169 398 444]
107 108 279 109 [535 533 520 490 489 226 497 390 239 429
401 445 970 1062 379]
 124 136 400 137 [922 869 305 550 749 973 334 671 268 273
513 770 545 341 580 512 459 737 762 580
549 762 580 263 343 514 762 341 321 580
505 580 341 702]
171 176 691 177 [661]
 178 181 568 182 185
341 186 [743]
 187 191 747 192 [474]
 193 196
736 197 198 634 199 [603]
 200 205 439 206
[421]
 207 210 425 211 214 268 215 [547]
 216
220 510 221 [367]
 222 225 531 226 227 459
228 [420 503 500 480 418]
 233 238 762 239 [691 926 666 627 737 736 766 613 518 637
606 499 1029 763 493 267 526 541 533 525
547 303 385 669 1071 914 876 722 803 561
1071 1081 798 787 1045 801 852 814 535 520
778 533 582 522 856 664 804 814 533 777]
 289 290 533
291 [578]
 292 293 800 294 298 480 299 [828 439 790 565 511 531 584 482 456 565
621 306 297 558 460 709 580 584 484 585
528 408 510 582 567 761 551 511 493 611
621 306 582 510 579 611 481 431 815 723
776 268 606 603 622 242 235 345 346 530
340 446 406 486 403 499 437 466 486 473
468 529 486 481 489 528 483 481 519 710
1009 711 493 338 465 452 497 454 495 464
475 488 493 480 479 574 480 482 480 568
483 486 482]
392 411 486 412 [305 349 355]
 415 416 292 417 [306 372 194 192 543 371 334 262 265 228]
427 436 341 437 [178 177]
 439 440 341 441 [259]
442 443 245 444 453 341 454 [178 177]
 456 457
341 458 [259]
 459 460 245 461 470 341 471
[178 177]
 473 474 341 475 [259]
 476 477 245 478
487 341 488 [178 177]
 490 491 341 492 [259]
 493
494 245 495 497 606 498 [454 469 407 563]
 502 507 691
508 [1058 813]
 510 512 691 513 520 766 521 [566 766]
523 526 757 527 [640 757 598 681]
 531 532 652 533 534
877 535 536 631 537 540 757 541 542 510
543 [256]
 544 545 846 546 [753 922 520 276 444 445]
 552 553 279
554 [356 379]
 556 557 347 558 559 345 560 561
346 562 [226]
 563 564 579 565 [586 587 760 556 375 490 718 561 536 641
757 531 568]
 578 580
691 581 [722]
 582 585 665 586 [735]
 587 591
568 592 596 715 597 [766]
 598 602 341 603
[329 673]
 605 608 538 609 [891]
 610 613 743 614
616 747 617 [749]
 618 620 621 621 [474 477]
 623
624 474 625 626 617 627 629 736 630 [733]
631 632 736 633 636 971 637 639 634 640
641 603 642 [869]
 643 644 1071 645 647 439
648 [512]
 649 652 423 653 [528]
 654 657 425
658 [424]
 659 663 468 664 [534]
 665 668 268
669 [258 496]
 671 673 253 674 [271 819]
 676 679 547
680 682 510 683 [513]
 684 686 371 687 [367 366]
689 690 367 691 692 305 693 698 531 699
702 685 703 705 459 706 707 420 708 [671 367]
710 711 492 712 724 400 725 728 565 729
[723]
 730 731 565 732 [568]
 733 734 565 735
[643]
 736 737 531 738 [528]
 739 740 531 741
[584]
 742 749 482 750 [487]
 751 755 565 756
[621]
 757 760 306 761 [474]
 762 763 306 764
[308 306 297 558]
 768 771 460 772 [478 709]
 774 778 580 779
785 584 786 [582 584]
 788 790 528 791 792 408
793 [412]
 794 795 408 796 797 510 798 804
582 805 [584]
 806 807 582 808 811 761 812
816 511 817 819 493 820 [401 402 401 381 401 375 404 400 401 400
401 400 367 401 691 588 507 641 568 603
766 739 341 673 686 891 743 607 747 738
563 598 617 655 754 654 725 757 691 568
766]
 861 862 341
863 [747]
 864 865 655 866 [757]
 867 873 691
874 882 910 883 887 691 888 895 568 896
901 766 902 910 972 911 914 766 915 926
341 927 932 757 933 941 1007 942 945 757
946 953 747 954 [563 341]
 956 963 655 964 [341 329 889 959 776 650 653 741 691 580
588 512 649 568 954 518]
980 981 752 982 [650 645 891 766 747 735 563 665 617 523
510 495 497 403 381 509 490 245]
 1000 1001 493 1002 [512 476 404 510 501 515 446 481 587 467
605 645 403 497 496 582 665 404 508 669
544 453 523 403 509]
1027 1028 245 1029 [510]
 1030 1031 481 1032 [645 245 481]
1035 1042 523 1043 1048 403 1049 1056 509 1057
1064 245 1065 1070 510 1071 1078 481 1079 1086
645 1087 1088 523 1089 1090 403 1091 1092 509
1093 1094 245 1095 1096 510 1097 1098 481 1099
1100 645 1101 1108 523 1109 1116 509 1117 1124
645 1125 1130 523 1131 1135 509 1136 1141 245
1142 1145 481 1146 1147 501 1148 [481]
 1149 1153
645 1154 [523 481]
 1156 1159 230 1160 1171 400 1172
[353]
 1173 1177 400 1178 1179 405 1180 [400 653 767 654 741 666 958 960 720 840
581 644 956 636 439 501 486 389 490 425
726 408]
 1202
1203 555 1204 [500 494 640 553 510 552 524 423 441 459
672 472 556 507 771 775 566 681 468 440
707 500 425 500 389 449 367]
 1231 1232 268 1233 [256 673 719 533 500 468 545 689 547 736
511 680 467 477 366 428 356 411 872 974
1124 1133 957 457 603 623 830 1006 806 1408
1744 1095 643 566 821 836 906 1602 1675 1584
427 892]
 1275
1276 745 1277 [465 619 776 427 341 566 892]
 1284 1287 400 1288 [747 736 525 547]
 1292
1293 480 1294 1305 691 1306 1313 568 1314 1315
341 1316 1327 747 1328 1334 736 1335 1337 634
1338 1349 439 1350 1357 425 1358 1359 268 1360
1366 510 1367 1371 525 1372 1373 531 1374 1378
547 1379 1381 459 1382 1393 637 1394 1401 606
1402 1413 565 1414 1421 482 1422 1423 306 1424
1436 584 1437 1444 582 1445 1447 511 1448 1457
400 1458 [392]
 1459 1480 400 1481 [565 511 531 584 482 456 565 621 306 297
558 460 709 580 584 484 585 528 408 510
582 567 761 551 511 493 611 621 582 510
579 611 481 431 723 776 603]
 1518 1521
565 1522 [723]
 1523 1524 565 1525 [568]
 1526 1528
565 1529 1530 531 1531 [528]
 1532 1533 531 1534
[584]
 1535 1542 482 1543 [487]
 1544 1548 565 1549
[621]
 1550 1556 306 1557 [308 306 297 558]
 1561 1564 460 1565
[478 709]
 1567 1571 580 1572 1578 584 1579 [582 584]
 1581
1583 528 1584 1585 408 1586 [412]
 1587 1588 408
1589 1590 510 1591 1597 582 1598 [584]
 1599 1600
582 1601 1604 761 1605 1609 511 1610 1612 493
1613 1624 565 1625 1632 482 1633 1634 306 1635
1647 584 1648 1655 582 1656 1658 511 1659 [477 366 617 305 356 227 400 159 226 306
159]
1670 1671 105 1672 [495 565 762 916 297 223 480 461 480 486
480 472 468 486]
]
>>
endobj


因此,代码为0的字形的宽度为500,代码1为227,代码2为276,代码3为318,代码4和5为480,代码6为756,等等。

此外,重要的是字体编码应为Identity-H,即纯2字节编码。

因此,在开始时,文本矩阵和文本行矩阵指向(0,0)。在39.812999 681.73999 Td之后,它们指向(39.812999,681.73999)。这是绘制'\ 000“'= 0x0022的地方。

图纸0x0022使位置前进tx =((.691-0)×14 + 0 + 0)×1 = 9.674至(49.486999,681.73999)。这是绘制'\ 000M'= 0x004d的地方。

...



如您所见,示例文件中的情况很简单:


不使用字符或单词间距,不进行水平缩放;
非常简单的文本和文本行矩阵,纯文本翻译;
当前转换矩阵没有变化;
没有标准的14种字体;
...


尽管如此,这个概念应该已经清楚了。

我希望我不要经常误算...;)

关于java - 探索pdf中的水平解析TJ(对tx公式的详细了解)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57988812/

10-12 05:52