delphi 如何使用TStreamWriter和TStreamReader读写PDF文件?

dauxcl2d  于 2023-02-04  发布在  其他
关注(0)|答案(4)|浏览(497)

下面是我的代码:

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。

k5ifujac

k5ifujac1#

PDF文件通常是压缩的二进制文件,因此无法读取为UTF8。这样做将导致编解码器错误。请记住,并非所有的字节序列都是有效的UTF8序列。
看起来您只需要调用CopyFile,而不是复杂的基于流的代码,但也许这只是一个简化的示例。

i1icjdpr

i1icjdpr2#

如果文件不为空,但ReadToEnd()返回空字符串,则用于将文件字节解码为Unicode的TEncoding对象遇到转换错误。RTL不会在出现字符串转换错误时引发异常。如果您所要做的只是制作文件的精确副本,请使用CopyFile(),或使用TFileStreamTStream.CopyFrom()方法。

bis0qfac

bis0qfac3#

您可以使用Embarcadero的ReadAllText函数,如下所示:

Uses IOUtils;

TFile.ReadAllText(FileName);

它将正确检测ANSI、Unicode和二进制文件。

p5cysglq

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...

相关问题