Delphi 如何使用TStreamWriter和TStreamReader读写PDF文件?
这是我的密码:Delphi 如何使用TStreamWriter和TStreamReader读写PDF文件?,delphi,pdf,delphi-xe,Delphi,Pdf,Delphi Xe,这是我的密码: 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:\Downlo
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。如果文件不是空的,但
ReadToEnd()
返回的是空字符串,则用于将文件字节解码为Unicode的TEncoding
对象遇到转换错误。RTL不会在字符串转换错误时引发异常。如果您只想制作文件的精确副本,请使用CopyFile()
,或使用TFileStream
和TStream.CopyFrom()
方法。PDF文件通常是压缩的二进制文件,因此不能作为UTF8读取。这样做将导致编解码器错误。请记住,并非所有字节序列都是有效的UTF8序列
看起来您只需要调用CopyFile而不是复杂的基于流的代码,但这可能只是一个简化的示例。您可以使用Embarcadero的ReadAllText函数。像这样:
Uses IOUtils;
TFile.ReadAllText(FileName);
它将正确检测ANSI、Unicode和二进制文件。事实上,我想在下一个过程中更改pdf的内容。我想我们已经回答了这个问题。你在评论中添加的内容是一个全新的问题!