下面是我的代码:
procedure TForm1.Button2Click(Sender: TObject);
var
Reader: TStreamReader;
Writer: TStreamWriter;
begin
Reader := TStreamReader.Create('D:\Downloads\cover.pdf', TEncoding.UTF8, False);
try
Writer := TStreamWriter.Create('D:\Downloads\coverb.pdf', False, TEncoding.UTF8);
try
Writer.Write(Reader.ReadToEnd());
finally
Writer.Free;
ShowMessage('Berhasil');
end;
finally
Reader.Free();
end;
end;
使用上面的代码Reader.ReadToEnd()
,我没有得到字符串,* coverb. pdf * 为空。
我用的是Delphi XE。
4条答案
按热度按时间k5ifujac1#
PDF文件通常是压缩的二进制文件,因此无法读取为UTF8。这样做将导致编解码器错误。请记住,并非所有的字节序列都是有效的UTF8序列。
看起来您只需要调用CopyFile,而不是复杂的基于流的代码,但也许这只是一个简化的示例。
i1icjdpr2#
如果文件不为空,但
ReadToEnd()
返回空字符串,则用于将文件字节解码为Unicode的TEncoding
对象遇到转换错误。RTL不会在出现字符串转换错误时引发异常。如果您所要做的只是制作文件的精确副本,请使用CopyFile()
,或使用TFileStream
和TStream.CopyFrom()
方法。bis0qfac3#
您可以使用Embarcadero的ReadAllText函数,如下所示:
它将正确检测ANSI、Unicode和二进制文件。
p5cysglq4#
您需要手动编写一个新的PDF文件吗?在这种情况下,您需要知道PDF文件格式的结构。使用ISO 32000-2格式版本2.0,所以可以用二进制流构建您的PDF文件,但请确保如果您使用一些现成的组件将更容易...
下面是一个如何手动操作的示例:https://blogs.embarcadero.com/how-to-create-a-pdf-file-with-delphi-and-add-an-image-to-it/(这个例子非常简单,所以不要在文件内部使用compress)
但我建议图书馆为GDPicture或Gnostice...