c# - iText7 PDF 正确呈现但在 Adobe Reader 中打印不正确
问题描述
我的任务是为许多现有的 PDF 添加水印,我在 C# 中为此使用 iText7。结果可以在这张图片中看到(使用空白pdf)
它在任何地方都可以很好地渲染,并且可以从 Chrome 和 Edge 完美打印。但是,当从 Adobe Acrobat Reader 打印时,会发生以下情况:
有谁比我更了解PDF,谁能帮助解决这个问题?我正在使用 iText 7.1.13 版。
测试 pdf 可在此处获得:
https://potanteststorage.blob.core.windows.net/pdf/Test.pdf
C#代码:
public static void AddProductionWatermarks(string sourceFile, string destinationPath)
{
float watermarkTrimmingRectangleWidth = 75;
float watermarkTrimmingRectangleHeight = 250;
//Custom text
float formWidth = 75;
float formHeight = 250;
float formXOffset = 0;
float formYOffset = 0;
float xTranslation = 50;
float yTranslation = 0;
double rotationInRads = Math.PI / 2;
PdfFont font = PdfFontFactory.CreateFont(StandardFonts.TIMES_ROMAN);
float fontSize = 12;
PdfDocument pdfDoc = new PdfDocument(new PdfReader(sourceFile), new PdfWriter(destinationPath));
var numberOfPages = pdfDoc.GetNumberOfPages();
PdfPage page = null;
for (var i = 1; i <= numberOfPages; i++)
{
page = pdfDoc.GetPage(i);
Rectangle ps = page.GetPageSize();
//PRODUCTION watermark -------------------------------------------------------
float prodBottomLeftX = -20;
float prodBottomLeftY = ps.GetHeight() / 2;
Rectangle prodWatermarkTrimmingRectangle = new Rectangle(prodBottomLeftX, prodBottomLeftY, watermarkTrimmingRectangleWidth, watermarkTrimmingRectangleHeight);
PdfWatermarkAnnotation prodWatermark = new PdfWatermarkAnnotation(prodWatermarkTrimmingRectangle);
AffineTransform transform2 = new AffineTransform();
transform2.Translate(xTranslation, yTranslation);
transform2.Rotate(rotationInRads);
PdfFixedPrint fixedPrint2 = new PdfFixedPrint();
prodWatermark.SetFixedPrint(fixedPrint2);
PdfFormXObject form2 = new PdfFormXObject(formRectangle);
PdfCanvas canvas2 = new PdfCanvas(form2, pdfDoc);
transform2.GetMatrix(transformValues);
canvas2.SaveState()
.BeginText().SetColor(new DeviceRgb(255, 36, 0), true)
.SetTextMatrix(transformValues[0], transformValues[1], transformValues[2], transformValues[3], transformValues[4], transformValues[5])
.SetFontAndSize(font, fontSize)
.ShowText("PRODUCTION")
.EndText()
.RestoreState();
canvas2.Release();
prodWatermark.SetAppearance(PdfName.N, new PdfAnnotationAppearance(form2.GetPdfObject()));
prodWatermark.SetFlags(PdfAnnotation.PRINT);
page.AddAnnotation(prodWatermark);
}
page?.Flush();
pdfDoc.Close();
}
解决方案
您在注释中使用FixedPrint字典:
PdfFixedPrint fixedPrint2 = new PdfFixedPrint();
prodWatermark.SetFixedPrint(fixedPrint2);
水印注释的这个附加条目指定了在打印期间如何相对于目标介质的尺寸绘制此注释。因此,您要求在打印过程中对水印进行特殊处理。
因此,如果您确实需要在打印期间进行特殊处理(而不是当前处理),只需PdfFixedPrint
相应地设置属性即可。
如果您不想在打印过程中进行任何特殊处理,则根本不要设置PdfFixedPrint
对象。
推荐阅读
- docfx - 为什么在使用docfx.json 中指定的自定义模板进行构建时,docfx 没有应用我的自定义模板文件?
- angular - p-calendar 无法通过 formControlName 修补时间值
- vue.js - 故事书/vue 的故事镜头因错误模块未找到而损坏:错误:无法解析“fs”
- swift - 快速将表格视图添加到表格视图单元格
- ruby - Ruby AWS 开发工具包 - 在没有 mfa 令牌的情况下使用 Aws::AssumeRoleCredentials
- python - 低采样率的 ads1115 缓冲区溢出
- c# - 在 LINQ 中使用命名元组数组
- cookies - FeathersJS socketio jwt 身份验证
- asp.net-web-api - 如何通过 Web 客户端调用将对象传递给期望对象作为参数的 Web API 控制器?
- activereports - Active Reports 12 - 使用自定义名称导出 RDL 报告