使用iTextSharp设置PDF版本

使用iTextSharp设置PDF版本,pdf,itextsharp,Pdf,Itextsharp,有人知道如何使用iTextSharp以编程方式将PDF保存为较低版本的PDF,以便您可以使用某些要求PDF为版本5或更低版本的iTextSharp功能吗 我正试图将两个PDF版本7文档合并在一起,但它坚持认为它们是版本5或更低版本。真奇怪。PDF版本主要是一个建议。PDF必须从以下内容开始: %PDF-1.x 其中X为0,1,2 这只是阅读PDF的应用程序的一个线索。唯一的线索。我从各种客户那里看到的大多数“我需要X版”请求都是假的。我的iText程序员同事们都知道这一点,所以我感到奇怪的是,

有人知道如何使用iTextSharp以编程方式将PDF保存为较低版本的PDF,以便您可以使用某些要求PDF为版本5或更低版本的iTextSharp功能吗


我正试图将两个PDF版本7文档合并在一起,但它坚持认为它们是版本5或更低版本。

真奇怪。PDF版本主要是一个建议。PDF必须从以下内容开始:

%PDF-1.x
其中X为0,1,2

这只是阅读PDF的应用程序的一个线索。唯一的线索。我从各种客户那里看到的大多数“我需要X版”请求都是假的。我的iText程序员同事们都知道这一点,所以我感到奇怪的是,iText要求一个不同的版本

你确定它是iText

无论如何,要回答您的问题:

是的,iText可以更改PDF的版本号。可悲的是,这只能在写PDF时完成,而不是在读PDF时完成。您必须打开PDF,更改其版本,然后再次保存

你可能会作弊。将PDF读入字节数组,并且
pdfBytes[7]=4
,然后将这些字节传递到
PdfReader

PDF规范的版本1是1.0 版本2是1.1

因此,如果你想要pdf版本5,你需要写出“1.4”,而不是“1.5”

如果您不喜欢这样戳一个字节,您可以解析整个PDF,更改版本,然后再次写出:

 PdfReader reader = new PdfReader(pdfPath);
 PdfStamper stamper = new PdfStamper(reader, outputStream);
 stamper.setPdfVersion(PdfWriter.PDF_VERSION_1_4);
 stamper.close();

然后你再把它读一遍,然后按原样把它合并起来。

看起来这不再有效,好吧,至少对我来说它不起作用了。然而,我发现了这一点,它对我起了作用:。

使用这个: writer.PdfVersion=PdfWriter.VERSION_1_3


这对我很有用

你写的,我不知道我用的是PDFSharp而不是iTextSharp。iTextSharp看起来好多了,但我有一个问题,“多奇怪的.PDF版本主要是一个建议。”这似乎值得明确一点——我来这里是因为我用嵌入式字体修补PDF。Adobe拒绝呈现这些字体。我将母版中的版本号设置为1.4,并且在Adobe中呈现良好。看起来至少在这种情况下,它从字面上理解了这个版本。也很奇怪。Adobe倾向于努力修复“损坏”的PDF,包括版本号不正确的PDF;自从我在7年多前写下这个答案以来,iText已经经历了几个主要的版本更改。OTOH,SetPdfVersion()上的文档现在显示为“如果尚未写入PDF标题,则会更改PDF标题中显示的版本。”。我怀疑你已经做了一些事情导致你的标题被写入。您可以通过移动SetPdfVersion来修复此问题,因此这是您拥有PdfWriter/PdfStamp后首先要做的事情。
///for itextSharp 5.4.4
PdfReader reader = new PdfReader(pdfPath);
PdfStamper stamper = new PdfStamper(reader, outputStream); 
stamper.Writer.setPdfVersion(PdfWriter.PDF_VERSION_1_4); 
stamper.close();