Comment intégrer des polices de caractères dans un PDF existant?

Contexte:

j'ai les PDF je suis par programmation génération. Je dois pouvoir envoyer le PDF directement à une imprimante à partir du serveur (et non par une application Intermédiaire). Pour le moment, je peux faire tout ce qui précède (générer PDF, Envoyer à l'imprimante), mais parce que les polices ne sont pas intégrées dans le PDF, l'imprimante fait la substitution de police.

pourquoi les polices ne sont pas intégrées lorsqu'elles sont générées:

je crée des PDF en utilisant SQL Reporting Services 2008. Il y a un problème connu avec les services de rapports SQL en ce sens qu'il n'intégrera pas de polices (à moins qu'une série d'exigences ne soient respectées - http://technet.microsoft.com/en-us/library/ms159713%28SQL.100%29.aspx ). Ne me demandez pas pourquoi, le PDF répond à toutes les exigences listées par MS et les polices apparaissent toujours comme non intégrées - il n'y a pas de contrôle réel sur si les polices sont intégrées, donc je j'ai accepté que ça ne marchait pas et j'ai tourné la page. La solution de contournement proposée par Microsoft ( http://blogs.msdn.com/b/donovans/archive/2007/07/20/reporting-services-pdf-renderer-faq.aspx sous "When will Reporting Services do font embedding") is to post process the PDF to manually embed the fonts.

Objectif Prenez un document PDF déjà généré, programmatically 'open' it et embed les polices, resave le PDF.

approche J'ai été pointé vers iTextSharp, mais la plupart des exemples sont pour la version Java et j'ai du mal à traduire vers la version iTextSharp (Je ne trouve aucune documentation pour iTextSharp).

je travaille sur ce poste pour ce que je dois faire: Itext police intégrée dans un PDF .

pour moi, Je ne peux pas utiliser L'objet ByteArrayOutputStream. Il n'arrive pas à le trouver. J'ai fait des recherches et des recherches, mais personne ne semble dire dans quelle classe il est ou où je le trouve donc je peux l'inclure dans les déclarations d'utilisation. J'ai même ouvert le réflecteur et je n'arrive pas à le trouver.

C'est ce que j'ai jusqu'à présent et il compile etc. etc. (résultat: mon octet [] du PDF généré).

PdfReader pdf = new PdfReader(result);            
BaseFont unicode = BaseFont.CreateFont("Georgia", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// the next line doesn't work as I need a ByteArrayOutputStream variable to pass in
PdfStamper stamper = new PdfStamper(pdf, MISSINGBYTEARRAYOUTPUTSTREAMVARIABLE);
stamper.AcroFields.SetFieldProperty("test", "textfont", unicode, null); 
stamper.Close();
pdf.Close();

alors n'importe qui peut m'aider à utiliser iTextSharp pour intégrer des polices dans un PDF ou me pointer dans le bonne direction?

je suis plus qu'heureux d'utiliser d'autres solutions que iTextSharp pour atteindre cet objectif, mais il doit être libre et capable d'être utilisé par une entreprise pour une application interne (i.e. Affero GPL).

24
demandé sur Community 2010-11-20 10:17:47

2 réponses

ce n'est peut-être pas la réponse que vous recherchez (puisque vous voulez résoudre vos problèmes par programmation, pas par un outil externe).

mais vous pouvez utiliser la ligne de commande Ghostscript pour intégrer les polices manquantes rétrospectivement aux fichiers PDF qui ne les ont pas intégrées:

gs \
  -sFONTPATH=/path/to/fonts:/another/dir/with/more/fonts \
  -o output-pdf-with-embedded-fonts.pdf \
  -sDEVICE=pdfwrite \
  -dPDFSETTINGS=/prepress \
   input-pdf-where-some-fonts-are-not-embedded.pdf

une chose importante est que les polices manquantes sont toutes disponibles dans un des répertoires pointés par le commutateur -sFontPath=... .

30
répondu Kurt Pfeifle 2010-12-25 14:02:31

outre Ghostscript, il est également possible d'utiliser Poppler et Le Caire. Il y a une commande pdftocairo de Poppler qui convertit PDF en PDF via pdftocairo -pdf input.pdf output.pdf . Il prend également en compte les substitutions de police définies dans un fichier de configuration Fontconfig . Cela est très utile si vous n'avez pas toutes les polices sur votre système qui sont référencées dans un fichier PDF, mais savoir quelle autre police vous avez installé est un bon remplacement. Après le traitement, l' la police de substitution est intégrée.

10
répondu Michael Fiedler 2014-12-20 22:44:50