我正在获取一个SGML文件,我使用uuDecoder从中提取数据,然后用它创建PDF。
多年以来一切正常,但是从最近几个月开始,我们观察到一些PDF文件无法加载,并且在Chrome中显示“无法加载PDF文档”。
我已经完成了下面的问题,这个问题与我的情况类似,但它是在Python中我在c#中有它#
How can we figure out why certain uuencoded files are not decoding properly using Python?
以下是具有嵌入式uuencoded pdf的txt文件的示例: https://www.sec.gov/Archives/edgar/data/1631661/000163166116000004/0001631661-16-000004.txt
我的uuDecoder算法代码与此完全相似: http://blog.stevex.net/2004/04/c-classes-to-decode-yenc-and-uuencode-encoded-usenet-binaries/
我发现它在下面的代码中抛出了索引超出范围的异常,它在一行中需要61个字符,但有些行没有准确的61个字符:
public static byte[] uuDecode(string buffer)
{
// Create an output array
byte[] outBuffer = new byte[(buffer.Length-1)/4*3];
int outIdx = 0;
// Get the string as an array of ASCII bytes
byte[] asciiBytes = Encoding.ASCII.GetBytes(buffer);
for (int i=0; i<asciiBytes.Length; i++)
{
asciiBytes[i] = (byte)((asciiBytes[i]-0x20) & 0x3f);
}
// Convert each block of 4 input bytes into 3
// output bytes
for (int i = 1; i <= (asciiBytes.Length-1); i += 4)
{
outBuffer[outIdx++] = (byte)(asciiBytes[i] << 2 | asciiBytes[i+1] >> 4);
outBuffer[outIdx++] = (byte)(asciiBytes[i+1] << 4 | asciiBytes[i+2] >> 2);
outBuffer[outIdx++] = (byte)(asciiBytes[i+2] << 6 | asciiBytes[i+3]);
}
return outBuffer;
}
请注意,此处没有任何与“索引超出范围”例外相关的内容,因此请不要将其重定向到那里。
我尝试用空格填充缺少的字符,如下所示:
if (line.Length < 61) ////Making sure length is 61 characters
{
var builder = new StringBuilder();
builder.Append(line);
var missing = 61 - line.Length;
for (int i = 0; i < missing; i++)
{
builder.Append(" ");
}
line = builder.ToString();
}
有人可以帮助我解释为什么这不适用于少量PDF文档?
答案 0 :(得分:2)
我认为问题出在空间。改进的uuEncode使用``(代码0x60)代替空格(0x20),可以修剪。尝试将所有线条填充到正确的全尺寸。试试这个转换(pdf.uue是文件的uuencoded部分 - 从begin
到end
):
string[] all = File.ReadAllLines(@"d:\tmp\pdf.uue");
for (int i = 1; i < all.Length - 2; i++)
{
if (all[i].Length < 61)
all[i] = all[i].PadRight(61, ' ');
}
File.WriteAllLines(@"d:\tmp\pdf-2.uue", all);
循环为1 .. Length-2
以跳过开始/结束行。