PDF禁用行上的消除锯齿功能

时间:2010-03-12 00:41:12

标签: pdf pdf-generation fpdf

我正在使用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 个答案:

答案 0 :(得分:1)

我没有确切的答案,但我认为这不仅仅是评论......

由于您已熟悉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)

基本上我所做的就是添加一个字典对象引用到主资源字典,然后创建实际字典对象,并将笔划调整规则设置为true。我还投入了规范示例所具有的传递函数,因为我不确定这是否有所作为。它很容易被取出。