代码之家  ›  专栏  ›  技术社区  ›  Travis

pdf禁用行上的反别名

  •  1
  • Travis  · 技术社区  · 14 年前

    我正在使用fpdf创建一个动态生成的pdf。

    我的pdf需要在网格中有很多水平/垂直线,渲染时它们是反锯齿的,看起来非常模糊,客户无法接受。我需要删除文档中这些(或所有)行的抗锯齿。

    我知道这是可能的,因为它在adobe pdf规范中显示得很正确。 http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf (警告:大文件) 请参阅第2页中的框了解其外观。

    如何复制此页上显示的框?

    --编辑——

    %PDF-1.6
    3 0 obj
    <</Type /Page
    /Parent 1 0 R
    /Resources 2 0 R
    /Contents 4 0 R>>
    endobj
    4 0 obj
    <</Length 44>>
    stream
    2 J
    1.00 w
    20.00 821.89 m 200.00 821.89 l S
    
    endstream
    endobj
    1 0 obj
    <</Type /Pages
    /Kids [3 0 R ]
    /Count 1
    /MediaBox [0 0 595.28 841.89]
    >>
    endobj
    2 0 obj
    <<
    /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
    /Font <<
    >>
    /XObject <<
    >>
    >>
    endobj
    5 0 obj
    <<
    /Producer (FPDF 1.6)
    /CreationDate (D:20100311190240)
    >>
    endobj
    6 0 obj
    <<
    /Type /Catalog
    /Pages 1 0 R
    /OpenAction [3 0 R /FitH null]
    /PageLayout /OneColumn
    >>
    endobj
    xref
    0 7
    0000000000 65535 f 
    0000000179 00000 n 
    0000000266 00000 n 
    0000000009 00000 n 
    0000000087 00000 n 
    0000000360 00000 n 
    0000000435 00000 n 
    trailer
    <<
    /Size 7
    /Root 6 0 R
    /Info 5 0 R
    >>
    startxref
    538
    %%EOF
    

    这是一个非常简单的pdf文件,它只画了一行来显示我遇到的问题。我发现诀窍是加上:

    /Type /ExtGState
    /SA false
    

    但我还不能让它工作。SA在上述PDF规范的10.6.5中定义

    1 回复  |  直到 14 年前
        1
  •  1
  •   Anthony    14 年前

    我没有确切的答案,但我知道这不仅仅是一个评论…

    既然您已经习惯了pdf规范,下面是您应该尝试的:

    找出fpdf是如何绘制这些线的。可能是它输出的pdf文件被压缩了,所以您应该下载 pdftk 去解压它。您可以使用命令:

     pdftk fpdf_output.pdf output fdf_readable.pdf uncompress
    

    在文本编辑器中打开pdf,看看这些线的绘制方式是否与您正在查看的pdf规范中的示例相同。

    如果没有,请查看fpdf用于绘制线的方法是否有抗锯齿选项(我是说,在pdf规范中)。如果fpdf以相同的方式绘制(或者如果它们的方式具有选项),请尝试更改输出文档(在文本编辑器中)以关闭抗锯齿。如果文档在文本编辑器中编辑后无法打开,则可以运行:

     pdftk fdf_readable.pdf output fdf_fixed.pdf
    

    它应该修复任何中断的引用或字节计数。

    然后打开你调整过的pdf文件,看看它是否像你要追求的。

    坏消息是:上面所做的唯一事情就是通过fpdf在引擎盖下使用的方法来验证抗锯齿是否可行。如果可能的话,有希望该特性已经存在,或者您可以提出一个特性请求,或者如果您真的很有信心,您可以尝试扩展fpdf以包含某种类型的 antialias("true|false") 方法。如果它们用于绘制线的方法与规范不同,并且没有关闭抗锯齿的选项,那么最好的选择可能是找到另一个pdf生成器,如 tcpdf ,看看他们是否提供这个功能。

    更新

    好吧,我想首先指出,我仍然看不到模糊性。所以我不知道这是否能解决你的问题。但我确实在您的示例中添加了自动笔划调整规则,pdf仍然打开。

    为了避免再次发布整个pdf,以下是您可以更新示例代码的方法:

    .........
    /Font <<
    >>
    /XObject <<
    >>
    
    //Start my edit right below this point in your example, so at line 31, add:
    
    /ExtGState << /GS1 10 0 R
    >>
    >>
    endobj
    10 0 obj
    <<
    /Type /ExtGState
    /SA true
    /TR 11 0 R
    >>
    endobj
    31 0 obj
    << /FunctionType 0
    /Domain [0.0 1.0]
    /Range [0.0 1.0]
    /Size 2
    /BitsPerSample 8
    /Length 7
    /Filter /ASCIIHexDecode
    >>
    stream
    01 00 >
    endstream
    endobj
    // Your code picks back up with:
    
    5 0 obj
    <<
    /Producer (FPDF 1.6)
    

    基本上,我所做的就是向主资源字典添加一个dictionary对象引用,然后使用设置为true的笔划调整规则创建实际的dictionary对象。我还抛出了spec示例所具有的传递函数,因为我不确定这是否有什么不同。很容易取出。