Type 3字体转换

问题描述 投票:0回答:1

我解析的Type3字体字形从PDF转换为后记。输入文件具有内嵌图像与数据流解码flate过滤applied.the滤波器具有预测15.任何机构可以帮助我如何把图像流形式的PDF后记。这是输入流是如何在给定的PDF

32 0 obj 
    <<
    /Length 342
    >>
    stream
    37 0 4 -52 33 -1 d1
    0.01 0 0 0.01 0 0 concat
    gsave 2900 0 0 -5100 400 -100 concat
    BI
    /IM true
    /W 29
    /H 51
    /BPC 1
    /D[1
    0]
    /F/Fl
    /DP<</Predictor 15
    /Columns 29>>
    ID xœ=Ì¡
    Â`ÅñÿeÂLθ n`0>Ù`ñ
    f[¦DŒF_ÁhC1ì%Ä)¶o.¢Ÿ"†ßá†s®àì]^ÏŠÅS³tFËÂÚ3sç'Æi èÐÇ:j‹¹¨åìOTÿ ª•ÉÙÕÅŸ¨‡¹Ó$°ÆΚWèÁ!¯Cê
    ÷0&f    µtðV ©Ë÷iôíتÄ~Ø•Œöí&´« +ro#Ê‚ûÏÅùlßG'
    EI gRestore

    endstream 
    endobj 

这里就是我想在输出到写后记

/g21 {
37 0 4 -52 33 -1 setcachedevice
q
[0.01 0 0 0.01 0 0] concat
q
[2900 0 0 -5100 400 -100] concat
[ xœ…ѱNÃ0à3©p'l` ¢abä*‰'@‚W`KP¡00öQ`d@ ¨CWž€u`‰štj4Ü]@ /ù¤œíÿ| ÂìÊüå7úŠ‰V'‚ª¦zò¡9à*´º
m1Õ`ñ—íü‹­‡½Gù@ãÝAVxc¥Ž®"6oFܬJHÃB3(æod¾…xFP†o$!v±Ã»·0—gØY÷J$û„`´#zÊ
Oí¼œÑ¸é`Ê}ü…ñ.Z¯›cF4\¡*O¤ÑPÒYòî¦/éG‘qÑç¼2>öq<Üœ<
B˜5‚²¢ºÎ/èqUTUàoÓ9͔Π܉ä²z ‡S×ÛÙC(PA²š7è­T¾ŽCGÈRaLéåksnˆÃ0z<zø:ž=
]
0
<<
  /ImageType 1
  /Width 29
  /Height 51
  /ImageMatrix [29 0 0 -51 0 51]
  /BitsPerComponent 1
  /Decode [1 0]
  /DataSource { 2 copy get exch 1 add exch }
    <</Predictor 15
    /Columns 29 
    >>
    /FlateDecode filter
>>
imagemask
pop pop
gRestore
gRestore
} def
pdf ghostscript acrobat postscript xpdf
1个回答
0
投票

的PostScript具有大致相同的过滤器的PDF。你并不需要解压缩数据,只需要使用PostScript中的FlateDecode过滤器并保留压缩数据不变。

请注意,您需要语言级别3预测15(或任何其他PNG预测),但是这不应该是一个问题,3级一直是标准的18年。

否则,你就需要实现一个版本,支持PNG预测的FlateDecode过滤器。我相信zlib的是颇能这一点。

[编辑]

您的“PostScript输出”是不完整的,您使用的PDF运营商,你有没有对提供的定义(Q和Q)。二话不说这使得它不可能通过翻译运行代码。请提供完整的简单例子文件的要求。不粘贴代码,我不倾向于去创建一个文件我自己,而且,二进制文件不剪切和粘贴都很好。

把我的头从办公桌的检查,我不能马上发现了问题所在,但因为我不能运行的代码,我可以很容易地失去了一些东西上面。

[EDIT 2]

而该文件,勿庸置疑,做工精细。

您还没有提供你所创建的PostScript文件。它相当困难的事情告诉什么地方错了,你看你开始使用PDF文件创建的PostScript格式。

你可以,当然,使用的Ghostscript(我看你用它来创建PDF文件)创建PostScript文件,然后看看包含。如果设置-dCompressFonts = false,那么输出的字体甚至不会被压缩。

例如:

37 0 4 -52 33 -1 d1
0.01 0 0 0.01 0 0 cm
q 2900 0 0 -5100 400 -99.9998 cm
BI
/IM true
/W 29
/H 51
/BPC 1
/D[1
0]
/F[/A85
/CCF]
/DP[null
<</K -1
/Columns 29>>]
ID
-D=,M5m+t^0_>op8\HM"Du]KKrr2rthqG/5qU_ik]$f$TlUslD91qoN93j0%dckk:ld^*DV25!+
!WX>~>
EI Q

当然,你需要看看序言看到所有的程序是如何使用的有定义的,但你可以做你自己,你肯定不会需要我去做。请注意,imagemask使用CCITTFax和ASCII85解码过滤器,它的琐碎添加额外的过滤器。由于数据被保证是“单色”(其掩模)的过滤器CCITT通常得到优异的压缩到Flate。

请注意,如果你真的会使用Ghostscript 9.05,那么你应该升级,也就是6岁。

这有可能会帮助,如果你要解释为什么要采取一个丑陋的,位图,3型自PDF字体并从中丑陋,位图3型PostScript字体。

[EDIT 3]

还有看你的PostScript文件,字形的定义不匹配你放什么在你的问题。实际的内容是这样的:

/g10135{
88  0  4  -70  82  8  setcachedevice 
q
[
0.01  0  0  0.01  0  0  ] M 
q
[7800  0  0  -7800  400  800  ]M 
<<
/ImageType 1
  /Width  78

  /Height  78

  /ImageMatrix [  78 0 0 -78 0 78]
  /BitsPerComponent  1

  /Decode [1
0]

  /DataSource ....binary data.....


<< /Predictor 15

 /Columns 78
/BitsPerComponent 1>>
/FlateDecode filter def
 >> imagemask
Q
Q
}bind def 

您还没有提供任何文件,程序或字符串来源,在字典中的数据源键的值。本质上,PostScript解释器的读取和tokenises的/DataSource键,然后前进到处理二进制以PostScript。不出所料这导致当使用Ghostscript处理的错误“中的SyntaxError(二进制令牌,类型= 156)”。

如果你有过过去那种,那么你会发现,filter运营商需要一个数据源以及和你没有提供的一个,要么。

所以,你需要为你的二进制数据的数据源。取决于你怎么做,但currentfile是单向的。或readstring因为你知道字符串的长度。

因此,像:

<<
  /ImageType 1
  /Width 29
  /Height 51
  /ImageMatrix [29 0 0 -51 0 51]
  /BitsPerComponent 1
  /Decode [1 0]
  /DataSource
  <length> string dup
  currentfile exch readstring
.....binary data.....
  <<
    /Predictor 15
    /Columns 29
  >> /FlateDecode filter
>> imagemask

很明显,你必须通过了解字符串长度自己填写。字典参数FlateDecode看起来对我来说不应该需要它。

[编辑4]我注意到,这似乎是用于商业用途。没有错,但我不会做的作业全都做对你来说,如果你的工作,它由你来学习语言不够好,做的工作。

我试图轻轻跳过实际的实施细则下面勾勒你要去哪里错了。在实践中事​​情有点复杂,我还没有讨论如何存储在CharStrings字典程序创建,或早期名称绑定的差别(这是用PostScript的一个重要概念)。

现有的代码是:

/g10135{
88  0  4  -70  82  8  setcachedevice 
q
[
0.01  0  0  0.01  0  0  ] M 
q
[7800  0  0  -7800  400  800  ]M 
<<
/ImageType 1
  /Width  78

  /Height  78

  /ImageMatrix [  78 0 0 -78 0 78]
  /BitsPerComponent  1

  /Decode [1
0]

  /DataSource   {417 string dup
 currentfile exch readstring}

...binary data....
<< /Predictor 15

 /Columns 78
>>/FlateDecode filter def
 >> imagemask
Q
Q
}bind def 

因此,PostScript解释一次读取这些字节一个,并将其转换为记号。这或者会导致一个可执行令牌,该令牌被执行,或在堆栈中的一个的操作。

所以/g10135{字符终止,因为这是一个保留字符。该/引入了一个名字对象,所以我们结束了我们推到操作数栈名对象g10135。该{字符引入一个可执行数组,所以我们把mark操作数栈上。

接下来,我们看88,由空白字符终止。这是一个数字,所以我们存储操作数栈上,同样是其他数字。操作数栈现在包含:

/g10135
mark
88
0
4
-70
82
8

然后,我们读setcachedevice,它是由一个空格终止。说了这么解释开始翻翻字典堆栈上的字典,寻找一个定义是不是一个标准的令牌。因为它是一个标准的运营商,我们发现它在systemdict并执行它。消耗从操作数栈6个操作数,它没有其他影响(实际上这样做,而是因为我们的字体内执行,这是一个有点特别,但我们会忽略现在)。

接下来我们遇到一个q,这同样是抬起头在每个字典词典堆栈上找到一个定义。这是在自己的序言作为gsave定义,所以它没有操作数,并没有返回操作数,它只是保存图形状态,递增1保存深度。

我不会去通过其他人来说将是乏味的,但是,最终我们达到你/DataSource,这是出了名的,所以我们将其推入操作数栈上。我们遇到的下一件事是{这是一个过程定义,所以我们的操作数堆栈上推的标志。然后,我们遇到417,所以我们推的是,stringdupcurrentfileexchreadstring,所以我们的堆栈的样子:

/DataSource
mark
417
string
dup
currentfile
exch
readstring

然后,我们得到了字符}这是一个可执行的阵列收盘标志,所以我们创建阵列并将其推入操作数栈:

/DataSource
{....}

然后我们回到程序,并继续执行它。我们发现,接下来的事情就是一些二进制数据,所以我们尝试执行以PostScript二进制令牌。因为它是无效的解释引发错误。

刚创建可执行阵列不足以实际执行它。如果你看一下大纲代码我在编辑3月底发布的上面,你会注意到,我没有把readstring等在可执行阵列,我只是让翻译立即执行该代码。

这样就readstringcurrentfile行为(在这种情况下,实际的PostScript程序),并读取该文件中的当前点数据的字节。消耗终止该readstring,即,实际的二进制数据的空白区域后的当前点将会立即。该readstring运营商从文件中读取足够的字节填充字符串,使操作数堆栈上的字符串。文件指针移动到该字节的二进制数据之后,并且解释在该点处恢复令牌扫描。因此,然后创建FilterParams字典把堆栈上的/ FlateDecode名称,然后执行filter运营商消耗的名字,字典和字符串操作数,返回一个文件对象。然后该文件对象成为与被传递给操作者imagemask在图像词典数据源键相关联的值。

虽然我还没有测试的代码,它基本上是正确的。当然还有其他的方法来达到同样的目的。

这基本上是关于据我准备去这一点,你需要去看看自己撰写的内容,并将其与自己的程序进行比较。

需要注意的是,调查这种最简单的方法是采取CharProc的内容(不包括setcachedevice),只是运行为PostScript程序。

© www.soinside.com 2019 - 2024. All rights reserved.