我使用 ASP.NET(Framework 3.5)和 Crystal Reports 在 PDF 文件中生成我学院学生的身份证,但我想将卡片打印在透明纸上并将其粘贴到相同尺寸的塑料卡片上,因为我需要所有要打印的镜像。我尝试以镜像形式设计水晶报表,但找不到以镜像形式编写文本的方法。任何人都可以建议一种方法来完成这项工作,我想要的只是翻转 PDF 文件或 Crystal Report 中的内容。
2 回答
A couple of Ideas:
1) Render the PDF to an Image (using Ghostscript/ImageMagick or commercial PDF library( (eg Tif) and mirror the image for printing
2) Mirror the PDF Itself, might be possible with iTextSharp
3) Use the reporting tool and try and use some kind of reverse font (coud be quick option)
任何允许您导入页面并直接写入 PDF 内容流的 API 都可以让您执行此操作。
在 iText (Java) 中,它看起来像这样:
PdfReader reader = new PdfReader(pdfPath);
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance( doc, new FileOutputStream(outPath) );
for (int pageNum = 1; pageNum <= reader.getNumberOfPages(); ++pageNum) {
PdfImportedPage page = writer.getImportedPage(reader, pageNum);
PdfContentByte pageContent = writer.getDirectContent();
// flip around vertical axis
pageContent.addTemplate(page, 1f, 0f, 0f, -1f, page.getWidth(), 0f);
doc.newPage();
}
上面的代码正在制作以下 ass-u-me-options:
- 默认
Document()
页面大小与当前PdfImportedPage
. - 源页面不旋转。
- 没有注释、可选内容组(层)和其他各种不只是在页面内容中表示的位。
一些解决方法:
// keep the page size consistent
PdfImportedPage page = writer.getImportedPage(reader, pageNum);
doc.newPage(page.getBoundingBox());
PdfContentByte pageContent = writer.getDirectContent();
pageContent.addTemplate(...);
// to compensate for a page's rotation, you need to either rotate the target page
// Easy in PdfStamper, virtually impossible with `Document` / `PdfWriter`.
AffineTransform unRotate = AffineTranform.getRotateInstance(degToRad(360 - pageRotation), pageCenterX, pageCenterY)
AffineTransform flip = new AffineTransform(1f, 0f, 0f, -1f, page.getWidth(), 0f);
AffineTransform finalTrans = flip;
finalTrans.concatenate(unRotate);
pageContent.addTemplate(page, finalTrans);
公平警告:我的 2d matrix-fu 并不是那么强大。我几乎可以肯定做错了什么。调试这些东西是真正的 PITA。东西要么“看起来不错”,要么被彻底搞砸了(因此不可见,所以你不知道它往哪边走)。我经常将页面矩形更改为 [-1000 -1000 1000 1000],这样我就可以看到它的去向。好玩的东西。
至于复制注释之类的……哎哟。PdfCopy 通过它的addPage()
方法为您完成所有这些工作,但这并不能让您首先转换页面内容。您对 PdfImportedPage 所做的任何更改都将被忽略。你真的被困难的方式困住了......手动复制所有繁琐的位并更改它们以补偿您翻页......或弄乱源以addPage()
获得您想要的结果。两者都需要对 PDF 有一些深入的了解。
鉴于具体情况,您可能无需担心,但值得一提的是,以防情况不同的人有相同的目标。